Skip to content

Instantly share code, notes, and snippets.

@plehanov
Forked from aslrousta/PessimistTransaction.php
Created June 16, 2020 14:07
Show Gist options
  • Select an option

  • Save plehanov/af9b6ed85a1488c30628e39ba6435977 to your computer and use it in GitHub Desktop.

Select an option

Save plehanov/af9b6ed85a1488c30628e39ba6435977 to your computer and use it in GitHub Desktop.
Pessimistic Locking for Transaction
<?php
function transfer($fromAccountId, $toAccountId, $amount)
{
DB::beginTransaction();
try {
$fromQuery = Account::whereId($fromAccountId);
if (! $fromQuery->exists()) {
throw new InvalidAccountException();
}
$toQuery = Account::whereId($toAccountId);
if (! $toQuery->exists()) {
throw new InvalidAccountException();
}
$fromAccount = $fromQuery->lockForUpdate()->first();
if ($amount > $fromAccount->balance) {
throw new InsufficientBalanceException();
}
$toAccount = $toQuery->lockForUpdate()->first();
$toAccount->balance += $amount;
$toAccount->save();
$fromAccount->balance -= $amount;
$fromAccount->save();
$transaction = new Transaction();
$transaction->from_account_id = $fromAccountId;
$transaction->to_account_id = $toAccountId;
$transaction->amount = $amount;
$transaction->save();
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment