Php 如何管理';订单';使用Laravel的数据库表中的列?

Php 如何管理';订单';使用Laravel的数据库表中的列?,php,mysql,sql,laravel,laravel-4,Php,Mysql,Sql,Laravel,Laravel 4,我没有找到关于Laravel数据库锁的太多信息,文档也非常模糊。 假设我有一张桌子: item +–––––––––––––––––––––--+ |id int(10) | |name varchar(255)| |parent_id int(10) [FK]| |order int(10) | +–––––––––––––––––––––--+ 我想锁定它(可以是整个表,但如果它只是选定的行,通常是具有相同父\u id的行,则会更好

我没有找到关于Laravel数据库锁的太多信息,文档也非常模糊。 假设我有一张桌子:

 item
+–––––––––––––––––––––--+
|id         int(10)     |
|name       varchar(255)|
|parent_id  int(10) [FK]|
|order      int(10)     |
+–––––––––––––––––––––--+
我想锁定它(可以是整个表,但如果它只是选定的行,通常是具有相同父\u 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\u id,order)
列上创建一个唯一的索引,以防止不一致,但我仍然需要锁来为用户提供响应能力(仅仅使更新失败不是一个解决方案)

也许用唯一索引加上一个事务就能解决这个问题? 比如:

DB::transaction(function() use($item, $newOrderArrayOrSomething) {
    // $item->order updates
});
提前感谢。

试试这个:

DB::transaction(function() use($item, $newOrderArrayOrSomething)
         {
            $item= Item::find($item);
            $item->order= $newOrderArrayOrSomething;
            $item->save();
         });

您检查过这个吗?是的,但是关于这个问题的完整“文档”实际上有两个多余的句子:
要使用“共享锁”运行SELECT语句,您可以在查询中使用sharedLock方法。
要在SELECT语句中“锁定以更新”,您可以在查询中使用lockForUpdate方法。
我不知道它们都做了什么,或者我是否可以将它们与Eloquent一起使用,以及我应该如何进行更新(因为为每个查询显示的唯一示例是一个select)。这是我在问题中写的,但我认为事务不能解决并发问题,它只在事务内部出现故障时才有用,因此所有更改都将回滚。为了让它工作,我需要一种方法来锁定选定的行,打开一个事务来逐个更新,保存并解锁这些行。