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' => 'Недостатньо коштів'];
});
}
}
Ці механізми блокування є надзвичайно важливими в додатках, де критично важлива точність даних, і кілька процесів можуть намагатися одночасно модифікувати одні й ті ж дані.