Управління перегонами даних за допомогою песимістичного блокування в Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 21 лютого, 2025
Laravel надає потужні можливості для реалізації песимістичного блокування, що запобігає конфліктам даних під час паралельних операцій у базі даних. Досліджте, як методи sharedLock() та lockForUpdate() можуть допомогти зберегти консистентність даних у умовах високої конкуренції

Laravel пропонує надійні можливості песимістичного блокування для запобігання конфліктам при одночасних операціях з базою даних. За допомогою методів sharedLock() та lockForUpdate() ви можете зберігати цілісність даних у ситуаціях з високою конкурентністю.

Метод sharedLock() забороняє зміни, але дозволяє читання:

DB::table('users')
    ->where('votes', '>', 100)
    ->sharedLock()
    ->get();

Для більш жорсткого контролю метод lockForUpdate() блокує як зміни, так і спільні блокування:

DB::table('orders')
    ->where('status', 'pending')
    ->lockForUpdate()
    ->get();

Цей підхід особливо важливий у фінансових транзакціях або системах управління запасами:

class PaymentController extends Controller
{
    public function processPayment($orderId, $amount)
    {
        return DB::transaction(function () use ($orderId, $amount) {
            $account = DB::table('accounts')
                ->where('order_id', $orderId)
                ->lockForUpdate()
                ->first();
            if ($account->balance >= $amount) {
                DB::table('accounts')
                    ->where('order_id', $orderId)
                    ->update(['balance' => $account->balance - $amount]);
                return ['success' => true, 'message' => 'Платіж оброблено'];
            }
            return ['success' => false, 'message' => 'Недостатньо коштів'];
        });
    }
}

Ці механізми блокування є надзвичайно важливими в додатках, де критично важлива точність даних, і кілька процесів можуть намагатися одночасно модифікувати одні й ті ж дані.