Метод beginTransaction
Метод beginTransaction принадлежит классу DB и используется для явного начала транзакции базы данных. При вызове этого метода все последующие операции с базой данных не фиксируются автоматически, пока не будет вызван метод commit или rollBack. Транзакции позволяют гарантировать целостность данных при выполнении нескольких связанных операций, обеспечивая их атомарность.
Синтаксис
<?php
use Illuminate\Support\Facades\DB;
DB::beginTransaction();
?>
Пример
Давайте создадим транзакцию для массового обновления данных:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
public function updateAll()
{
DB::beginTransaction();
try {
DB::table('users')->update(['status' => 'active']);
DB::table('profiles')->update(['active' => true]);
DB::commit();
echo "Users updated successfully";
} catch (\Exception $e) {
DB::rollBack();
echo "Error: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Users updated successfully"
Пример
Транзакция с проверкой условий перед фиксацией:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class OrderController extends Controller
{
public function createOrder($userId, $total)
{
DB::beginTransaction();
try {
$orderId = DB::table('orders')->insertGetId([
'user_id' => $userId,
'total' => $total,
'status' => 'pending',
'created_at' => now(),
]);
DB::table('order_items')->insert([
'order_id' => $orderId,
'product_id' => 1,
'quantity' => 2,
'price' => 500,
]);
$balance = DB::table('accounts')
->where('user_id', $userId)
->value('balance');
if ($balance < $total) {
DB::rollBack();
echo "Insufficient balance";
return;
}
DB::table('accounts')
->where('user_id', $userId)
->decrement('balance', $total);
DB::commit();
echo "Order created successfully";
} catch (\Exception $e) {
DB::rollBack();
echo "Error: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Order created successfully"
Пример
Вложенные транзакции с использованием beginTransaction:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class TransactionController extends Controller
{
public function nestedTransaction()
{
DB::beginTransaction();
try {
DB::table('logs')->insert([
'message' => 'Outer transaction started',
'created_at' => now(),
]);
DB::beginTransaction();
try {
DB::table('logs')->insert([
'message' => 'Inner transaction started',
'created_at' => now(),
]);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
DB::commit();
echo "Both transactions committed";
} catch (\Exception $e) {
DB::rollBack();
echo "Transaction failed: " . $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Both transactions committed"
Смотрите также
-
метод
commit,
который фиксирует изменения в транзакции -
метод
rollBack,
который откатывает изменения в транзакции -
метод
transaction,
который автоматически управляет транзакциями -
метод
table,
который предоставляет построитель запросов для таблиц