mysql 是否在lockForUpdate后获取旧记录?

pu82cl6c  于 2023-01-12  发布在  Mysql
关注(0)|答案(1)|浏览(86)

我的代码:

DB::transaction(function () {
       $foo = Foo::whereId(1)->lockForUpdate()->with('bars')->first();
       // dump foo & bars
       // update foo's columns
       // update bars' columns
   });

这个代码我同时运行了两次,第一次可以正确更新,但是第二次查询foo时,foo的列是正确的,但是bars仍然是旧的(在数据库中是正确的),为什么会这样?如何解决?

xxls0lw8

xxls0lw81#

由于您使用的是lockForUpdate()并希望在更新后使用新数据,因此需要使用refresh()重新水合模型
刷新方法将使用数据库中的最新数据重新水合现有模型。此外,还将刷新其所有加载的关系:
https://laravel.com/docs/9.x/eloquent#refreshing-models
NoOorZ24@Laravel lockforupdate (Pessimistic Locking)给出了一个很好的答案,解释了事务锁是如何工作的,以进一步澄清。

相关问题