如何在 Laravel 5.5 中设置事务隔离级别?

问题描述 投票:0回答:2

在带有 MySQL 的 Laravel 5.5 中,我使用

\Illuminate\Support\Facades\DB
以这种方式创建事务:

DB::transaction(function() {
    ...
});

此类事务的隔离级别是什么?有没有办法明确设置它?

php laravel transactions isolation-level
2个回答
11
投票

SqlLite中的默认值为

'BEGIN IMMEDIATE TRANSACTION';

MySQL中的默认值是

'SET TRANSACTION ISOLATION LEVEL READ COMMITTED';

您可以通过执行以下操作自行设置

$pdo = DB::connection()->getPdo();
$pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');

0
投票

对于 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
    ,以便在出现任何错误时再次运行代码
© www.soinside.com 2019 - 2024. All rights reserved.