我没有找到有关Laravel数据库锁的大量信息,文档非常模糊。 所以,想象一下我有这张桌子:
item
+–––––––––––––––––––––--+
|id int(10) |
|name varchar(255)|
|parent_id int(10) [FK]|
|order int(10) |
+–––––––––––––––––––––--+
我想锁定它(可以是整个表,但如果它只是选定的行,通常是那些具有相同parent_id的行会更好),然后更新那些行上的order列,考虑到几个人正在同时更新。
据我所知,最后保存的用户会覆盖订单而且在这种情况下没问题,我唯一能做到的就是以下内容:
User A, B
A saves item[1] with order = 1
A saves item[2] with order = 2
B saves item[1] with order = 2
B saves item[2] with order = 3
B saves item[3] with order = 1
A saves item[3] with order = 3
End result:
item[1]->order = 2
item[2]->order = 3
item[3]->order = 3
那里存在不一致。
我计划在列(parent_id, order)
上创建一个UNIQUE索引,以防止出现不一致,但我仍然需要锁来为用户提供响应(只是让更新失败不是解决方案)。
也许用UNIQUE索引加一个事务会解决吗? 类似的东西:
DB::transaction(function() use($item, $newOrderArrayOrSomething) {
// $item->order updates
});
提前致谢。
答案 0 :(得分:0)
试试这个:
DB::transaction(function() use($item, $newOrderArrayOrSomething)
{
$item= Item::find($item);
$item->order= $newOrderArrayOrSomething;
$item->save();
});