我没有找到太多关于 Laravel 数据库锁的信息,文档也非常模糊。 所以,假设我有这张表:
item
+–––––––––––––––––––––--+
|id int(10) |
|name varchar(255)|
|parent_id int(10) [FK]|
|order int(10) |
+–––––––––––––––––––––--+
我想锁定它(可以是整个表,但如果只是选定的行会更好,通常是具有相同 parent_id 的行),然后更新这些行上的顺序列,考虑到几个人正在同时更新。
我知道最后保存它的用户会覆盖订单,在这种情况下没关系,我唯一不能让发生的是以下情况:
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
});
提前致谢。
最佳答案
试试这个:
DB::transaction(function() use($item, $newOrderArrayOrSomething)
{
$item= Item::find($item);
$item->order= $newOrderArrayOrSomething;
$item->save();
});
关于php - 如何使用 Laravel 管理数据库表中的 'order' 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22958867/