没有数据库异常发生时Laravel事务不会回滚

时间:2019-07-10 06:09:20

标签: php mysql laravel transactions

这是我的代码:

 DB::transaction(function () use ($r, $certificate, $candidate) {

             UserCertificate::create([
                 'user_id' => $r['user_id'],
                 'certificate_id' => $certificate->id,
                 'issue_date' => Carbon::now()
              ]);

             // create badge
             $this->createCandidateBadge($candidate, $certificate);

});

创建候选徽章时发生异常:$this->createCandidateBadge

但是当我看到user_certificates表时,就创建了一个证书!除非成功创建了徽章,否则我不想在数据库中创建证书!

2 个答案:

答案 0 :(得分:1)

您可以使用try和catch块来进行自定义的交易功能以及手动提交和回滚:

DB::beginTransaction();

try{
        UserCertificate::create([
             'user_id' => $r['user_id'],
             'certificate_id' => $certificate->id,
             'issue_date' => Carbon::now()
          ]);

         // create badge
         $this->createCandidateBadge($candidate, $certificate);

         DB::commit();

}catch (\Exception $e){
    DB::rollBack();
}

如果有任何类型的异常,它将被捕获,然后所有数据库操作将被回滚。如果没有异常,将保存数据。

答案 1 :(得分:1)

根据文档Database Transactions

  

如果在事务关闭中引发异常,则   交易将自动回滚。

您应该尝试通过DB::transaction将逻辑包装在try...catch中,如下所示:

DB::transaction(function () use ($r, $certificate, $candidate) {
    try {
         UserCertificate::create([
             'user_id' => $r['user_id'],
             'certificate_id' => $certificate->id,
             'issue_date' => Carbon::now()
         ]);

         // create badge
         $this->createCandidateBadge($candidate, $certificate);

    } catch (\Exception $e) {
         // Response with Error here
    }
});
// Response with success

还要检查此问题Laravel: Using try…catch with DB::transaction()

享受:)