我的代码:
DB::transaction(function () {
$foo = Foo::whereId(1)->lockForUpdate()->with('bars')->first();
// dump foo & bars
// update foo's columns
// update bars' columns
});
这个代码我同时运行了两次,第一次可以正确更新,但是第二次查询foo
时,foo
的列是正确的,但是bars
仍然是旧的(在数据库中是正确的),为什么会这样?如何解决?
1条答案
按热度按时间xxls0lw81#
由于您使用的是
lockForUpdate()
并希望在更新后使用新数据,因此需要使用refresh()
重新水合模型刷新方法将使用数据库中的最新数据重新水合现有模型。此外,还将刷新其所有加载的关系:
https://laravel.com/docs/9.x/eloquent#refreshing-models
NoOorZ24@Laravel lockforupdate (Pessimistic Locking)给出了一个很好的答案,解释了事务锁是如何工作的,以进一步澄清。