php Laravel Eloquent查询不会回滚

ig9co6j1  于 2023-03-28  发布在  PHP
关注(0)|答案(3)|浏览(230)

我一直试图让这个工作,但它就是不工作。我有这个功能,我插入多个记录到不同的表在同一时间,我使用事务,但它不会回滚时,其中一个查询失败。
参见示例:

private function valBankInvestment($bank, $investment, $investment1, $data){
   DB::beginTransaction();
   $new_bank = DB::table('bank_accounts')->insert($bank);
   $new_inv = Investments::create($investment);
   $inv_log = DB::table('investment_logs')->insertGetId($investment1);
   $trader = Traders::create($data);
   if ($new_bank && $new_inv && $inv_log && $trader) {
      DB::commit();
      return true;
   }
   DB::rollBack();
   return false;
}

我想实现的是,如果这些查询中的任何一个失败,上述函数应该回滚。请帮助我解决这个问题。

wydwbb8l

wydwbb8l1#

为了回滚事务,您需要捕获异常。如果您不这样做,代码将退出而不调用它

private function valBankInvestment($bank, $investment, $investment1, $data){
   DB::beginTransaction();
   try {
      $new_bank = DB::table('bank_accounts')->insert($bank);
      $new_inv = Investments::create($investment);
      $inv_log = DB::table('investment_logs')->insertGetId($investment1);
      $trader = Traders::create($data);
   } catch (\Exception $e) {
      DB::rollBack();
      return false;
   }
   if ($new_bank && $new_inv && $inv_log && $trader) {
      DB::commit();
      return true;
   } else {
      DB::rollBack();
      return false;
   }
}
mum43rcc

mum43rcc2#

laravel中的rollback方法需要数据库中的表才能使用InnoDB引擎。Rollback方法不适用于MyISAM。您可以通过以下两种方式来实现:
首先,在数据库配置config/database.php中更改默认引擎,并更改为这一行;'engine' => 'InnoDB',在您的mysql驱动程序连接.
第二,在创建表时,在迁移中添加以下行;

$table->engine = 'InnoDB';
nnsrf1az

nnsrf1az3#

@N69S的答案也是正确的,但我喜欢的方式,这是很容易阅读

private function valBankInvestment($bank, $investment, $investment1, $data){

return \DB::transaction(function () use ($bank, $investment, $investment1, $data){
    $new_bank = DB::table('bank_accounts')->insert($bank);
    $new_inv = Investments::create($investment);
    $inv_log = DB::table('investment_logs')->insertGetId($investment1);
    $trader = Traders::create($data);
    return  $new_bank && $new_inv && $inv_log && $trader;
  });
}

相关问题