首页 > 解决方案 > 当没有数据库异常发生时,Laravel 事务不会回滚

问题描述

这是我的代码:

 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表格时,会创建一个证书!除非成功创建徽章,否则我不想在 DB 中创建证书!

标签: phpmysqllaraveltransactions

解决方案


您可以使用 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();
}

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


推荐阅读