РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
382 of 1392 menu

Метод 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,
    который предоставляет построитель запросов для таблиц
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить