这是我的代码:
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
表时,就创建了一个证书!除非成功创建了徽章,否则我不想在数据库中创建证书!
答案 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)
如果在事务关闭中引发异常,则 交易将自动回滚。
您应该尝试通过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()
享受:)