Метод commit
Метод commit класса DB применяется для подтверждения
транзакции в базе данных. Он фиксирует все изменения, выполненные
в рамках текущей транзакции, и делает их постоянными. Метод
вызывается после успешного выполнения всех операций внутри
транзакции. Если транзакция не была начата, вызов метода
приведёт к исключению.
Синтаксис
<?php
DB::commit();
?>
Пример
Давайте выполним простую транзакцию по переводу средств между пользователями:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
use AppModelsUser;
class TransferController extends Controller
{
public function transfer($from, $to, $amount)
{
DB::beginTransaction();
try {
$sender = User::find($from);
$receiver = User::find($to);
$sender->balance -= $amount;
$receiver->balance += $amount;
$sender->save();
$receiver->save();
DB::commit();
echo "Transfer completed successfully";
} catch (Exception $e) {
DB::rollBack();
echo "Transfer failed: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода при успешном переводе:
"Transfer completed successfully"
Пример
Давайте выполним транзакцию с добавлением заказа и обновлением количества товара на складе:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
use AppModelsOrder;
use AppModelsProduct;
class OrderController extends Controller
{
public function createOrder($productId, $quantity)
{
DB::beginTransaction();
try {
$product = Product::find($productId);
if ($product->stock < $quantity) {
throw new Exception("Not enough stock");
}
$order = new Order();
$order->product_id = $productId;
$order->quantity = $quantity;
$order->save();
$product->stock -= $quantity;
$product->save();
DB::commit();
echo "Order created successfully";
} catch (Exception $e) {
DB::rollBack();
echo "Order creation failed: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода при успешном создании заказа:
"Order created successfully"
Пример
Давайте выполним транзакцию с множественными обновлениями в разных таблицах:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
use AppModelsUser;
use AppModelsProfile;
use AppModelsSettings;
class UserController extends Controller
{
public function updateUserSettings($userId, $data)
{
DB::beginTransaction();
try {
$user = User::find($userId);
$user->name = $data['name'];
$user->email = $data['email'];
$user->save();
$profile = Profile::where('user_id', $userId)->first();
$profile->bio = $data['bio'];
$profile->avatar = $data['avatar'];
$profile->save();
$settings = Settings::where('user_id', $userId)->first();
$settings->language = $data['language'];
$settings->timezone = $data['timezone'];
$settings->save();
DB::commit();
echo "User settings updated successfully";
} catch (Exception $e) {
DB::rollBack();
echo "Update failed: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода при успешном обновлении:
"User settings updated successfully"
Смотрите также
-
метод
beginTransaction,
который начинает новую транзакцию -
метод
rollBack,
который отменяет транзакцию -
метод
transaction,
который автоматически управляет транзакцией -
метод
afterCommit,
который выполняет действие после фиксации транзакции