Php 数据库事务Laravel未回滚
如果满足某个条件,我将尝试使用Laravel DB facade回滚数据库事务。但是我的回滚不起作用 首先,我用Php 数据库事务Laravel未回滚,php,laravel,Php,Laravel,如果满足某个条件,我将尝试使用Laravel DB facade回滚数据库事务。但是我的回滚不起作用 首先,我用DB::beginTransaction()启动了我的DB事务 其次,我编写了查询以创建以下内容: 创建新的付款批次 创建付款批记录 创建付款审批 创建付款审批人 第三,我然后做了一些条件,以知道何时回滚或提交我的DB事务。但是,回滚不起作用。示例我的代码中满足了此条件块,但从未回滚 if(!$mail_status){ DB::rollBack(); return ba
DB::beginTransaction()启动了我的DB事务代码>
其次,我编写了查询以创建以下内容:
创建新的付款批次
创建付款批记录
创建付款审批
创建付款审批人
第三,我然后做了一些条件,以知道何时回滚或提交我的DB事务。但是,回滚不起作用。示例我的代码中满足了此条件块,但从未回滚
if(!$mail_status){
DB::rollBack();
return back()->with('error', 'Mail not send to approvers. Try again or contact system administrator.');
}
下面是完整的代码块
//Start transaction
DB::beginTransaction();
try{
//Run Queries
//Create a new payment batch
$batch = Batch::create([
'uuid' => uniqid(),
'batch_name' => $batch_config->batch_name,
'service_code' => Auth::user()->service_code,
'created_by' => Auth::user()->name,
]);
//Create parameters for new payment batch record
foreach($batch_record_config as $data){
$record[] = [
'batch_id' => $batch->batch_id,
'payee_name' => $data['payee_name'],
'bank_id' => $data['bank_id'],
'bank_name' => $data['bank_name'],
'account_type' => $data['account_type'],
'account_number' => $data['account_number'],
'amount' => $data['amount'],
'description' => $data['description'],
'year' => date("Y"),
'month' => date("F", mktime(0, 0, 0, date("n"), 10)),
'uuid' => uniqid(),
'service_code' => Auth::user()->service_code,
'created_at' => now(),
'created_by' => Auth::user()->name,
];
}
$batch_record_status = DB::table('batch_record')->insert($record);
//Generate new payment approval
$payment_approval = PaymentApproval::create([
'uuid' => uniqid(),
'batch_id' => $batch->batch_id,
'service_code' => Auth::user()->service_code,
'created_by' => Auth::user()->name,
'deleted' => 0,
]);
//Generate payment approvers for the payment approval
$payment_approvers = [];
foreach($approval_users as $data){
$payment_approvers[] = [
'uuid' => uniqid(),
'payment_approval_id' => $payment_approval->id,
'approval_user_id' => $data->id,
'approval_level_id' => $data->approval_level_id,
'batch_id' => $batch->batch_id,
'approval_position_value' => $data->approval_level->approval_position,
'approval_level_name' => $data->approval_level->approval_level,
'user_id' => $data->user_id,
'batch_name' => $batch->batch_name,
'service_code' => Auth::user()->service_code,
'approved' => 0,
'deleted' => 0,
'created_at' => now(),
'created_by' => Auth::user()->name,
];
}
$payment_approvers_status = DB::table('payment_approvers')->insert($payment_approvers);
// If DB transcation is successful.
if($batch && $batch_record_status && $payment_approval && $payment_approvers_status){
//get the next approvers
$next_approvers = $this->next_approvals($payment_approval->id);
if($next_approvers){
//send mail to the next approvers
$mail_status = $this->send_approvers_mail($next_approvers,$batch);
if(!$mail_status){
DB::rollBack();
return back()->with('error', 'Mail not send to approvers. Try again or contact system administrator.');
}else{
DB::commit();
return back()->with('success', 'Batch has being initialized');
}
}else{
DB::rollBack();
return back()->with('error', 'Approvers not found. Try again or contact system administrator.');
}
}else{
DB::rollBack();
return back()->with('error', 'Something went wrong. Try again.');
}
}catch(\Exception $e){
DB::rollBack();
dd($e);
return back()->with('error', 'Something went wrong... Contact system administrator. Thanks.');
}
您没有提到DB get commit或抛出一些错误?请检查邮件函数响应中的内容。我认为您在邮件中获得了成功,因为您的else条件是不执行任何案例。我查看了您的,正如其他人正确指出的,您需要提交事务。我在你的代码里看不到。据我所知,基本上有两种使用事务的方法。
1.
二,
如果您使用的是第二种方法,则不必进行任何提交,失败时将自动回滚
我想这是你这一行的错误
$next\u approvers=$this->next\u approvals($payment\u approval->id);
我找不到代码中定义的*next_approvals8属性,而且您正在使用Laravel ORM和Raw语句(PaymentApproval::create&DB::table('batch_record')->insert($record);)
尝试坚持使用1,看看是否有效。您需要提交DB::commit()最后使用代码>并使用DB::beginTransaction()代码>在try部分中有一个DB::commit();在检查邮件是否成功的条件内。我还尝试包括DB::BeginTransaction();在try-catch内,但也不起作用。DB::beginTransaction
调用不需要在try/catch块内,不用担心。哪个回滚不工作?所有回滚都不工作。如果邮件不成功,我更感兴趣。
\DB::beginTransaction();
try {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
} catch (\Exception $e) {
$count = 0;
\DB::rollBack();
\Log::info(self::LOG_PREFIX . 'Some Msg ', [$e->__toString()]);
}
\DB::commit();
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});