Я использую транзакцию базы данных laravel5.5 для приложения онлайн-платежей. У меня есть таблица company_account для записи каждого платежа (type
, amount
, create_at
, gross_income
). Мне нужно получить доступ к последней записи gross_income
, когда создается новая запись. Поэтому мне нужно заблокировать таблицу при транзакции с блокировкой таблицы чтения и записи, чтобы избежать многих платежей одновременно.
Я ссылаюсь на laravel doc, но я не уверен, что транзакция заблокирует таблицу. Если транзакция заблокирует таблицу, какой тип блокировки (блокировка чтения, блокировка записи или обе)?
DB::transaction(function () {
// create company_account record
// create use_account record
}, 5);
Код:
DB::transaction(function ($model) use($model) {
$model = Model::find($order->product_id);
$user = $model->user;
// **update** use_account record
try {
$user_account = User_account::find($user->id);
} catch (Exception $e){
$user_account = new User_account;
$user_account->user_id = $user->id;
$user_account->earnings = 0;
$user_account->balance = 0;
}
$user_account->earnings += $order->fee * self::USER_COMMISION_RATIO;
$user_account->balance += $order->fee * self::USER_COMMISION_RATIO;
$user_account->save();
// **create** company_account record
$old_tiger_account = Tiger_account::latest('id')->first();
$tiger_account = new Tiger_account;
$tiger_account->type = 'model';
$tiger_account->order_id = $order->id;
$tiger_account->user_id = $user->id;
$tiger_account->profit = $order->fee;
$tiger_account->payment = 0;
$tiger_account->gross_income = $old_tiger_account-> gross_income + $order->fee;
$tiger_account->save();
}, 5);
Рекомендации:
Как передать параметр в Laravel DB ::action()