关于在Laravel 中支持Mongo事务的一些问题

在 GitHub 上面看到了这么一个 PR , 看了一下代码似乎不能够通过测试用例。 但是实际上的 CI 构建日志却显示全部通过。希望大佬给予解答。关键代码会在文章下方给出,文章也附有 GitHub 源码链接,希望大家帮我看看。

关于在Laravel 中支持Mongo事务的一些问题
主要我有疑问的是这个 tests/TransactionTest.php 测试用例的 testTransaction 这个测试。 Diff 信息链接 根据 Laravel 源码中 src/Illuminate/Database/Concerns/ManagesTransactions.php ManagesTransactions.php#L44 第 44 行的代码,想要事务能够成功执行 $this->transactions 的值一定要是 1 。而扩展的代码重写了 beginTransaction 这个函数,那么原本 115 行的 $this->transactions++; 就没有被执行到,导致 44 行的判断 if ($this->transactions == 1) 就不可能成立事务不会被执行。

Laravel 中的 beginTransaction

代码已被折叠,点此展开

扩展中的 beginTransaction

public function beginTransaction()
{
    $this->session_key = uniqid();
    $this->sessions[$this->session_key] = $this->connection->startSession();

    $this->sessions[$this->session_key]->startTransaction([
        'readPreference' => new ReadPreference(ReadPreference::RP_PRIMARY),
        'writeConcern' => new WriteConcern(1),
        'readConcern' => new ReadConcern(ReadConcern::LOCAL)
    ]);
}

扩展中的测试用例。

public function testTransaction()
 {
     $count = DB::collection('users')->count();
     $this->assertEquals(1, $count);

     $new_age = $this->originData['age'] + 1;
     DB::transaction(function () use ($new_age) {
         DB::collection('users')->insert($this->insertData);
         DB::collection('users')->where('name', $this->originData['name'])->update(['age' => $new_age]);
     });
     $count = DB::collection('users')->count();
     $this->assertEquals(2, $count);

     $checkInsert = DB::collection('users')->where('name', $this->insertData['name'])->first();
     $this->assertNotNull($checkInsert);
     $this->assertEquals($this->insertData['age'], $checkInsert['age']);

     $checkUpdate = DB::collection('users')->where('name', $this->originData['name'])->first();
     $this->assertEquals($new_age, $checkUpdate['age']);
 }
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。