在带有 MySQL 的 Laravel 5.5 中,我使用
\Illuminate\Support\Facades\DB
以这种方式创建事务:
DB::transaction(function() {
...
});
此类事务的隔离级别是什么?有没有办法明确设置它?
SqlLite中的默认值为
'BEGIN IMMEDIATE TRANSACTION';
MySQL中的默认值是
'SET TRANSACTION ISOLATION LEVEL READ COMMITTED';
您可以通过执行以下操作自行设置
$pdo = DB::connection()->getPdo();
$pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
对于 PostgreSQL
由于这是有关在 Laravel 事务中设置隔离级别的唯一问题,我将用我的代码片段扩展之前的答案:
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
DB::statement('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
anyMethodWithConcurrentQueries();
}, 2);
DB::statement
看起来干净一点DB::transaction
函数内,否则它将无法工作(在PostgreSQL上测试,可能会有所不同)2
,以便在出现任何错误时再次运行代码