Laravel 文档建议使用尝试来处理死锁(https://shorturl.at/bsKta)
但是,transaction()方法内部的handleTransactionException()方法有一个注释:
发生死锁时,MySQL 会回滚整个事务,因此我们不能只是重试查询。我们必须把这个异常全部抛出,让开发者用另一种方式处理。我们也会减少。
这是否意味着要处理死锁,我应该用 try/catch 包装 DB::transaction() ?那么在这种情况下尝试有什么用呢?
正如Larave Doc中提到的,
attempts
的意思是:
指定发生死锁时应重试事务的次数。
但是关于使用
try/catch
,我可以说当MySQL遇到死锁时,它会抛出异常。 try/catch
允许您在异常情况下执行某些操作。例如:
try {
DB::transaction(function () {
// Your transaction logic
}, 5); // Laravel will attempt the transaction up to 5 times
} catch (\Exception $e) {
// Handle the error after all attempts fail
// For example, you can log the error or show a message to the user
Log::warning($e->getMessage());
}