如何管理'订购' Laravel数据库表中的列?

时间:2014-04-09 09:52:08

标签: php mysql sql laravel laravel-4

我没有找到有关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
});

提前致谢。

1 个答案:

答案 0 :(得分:0)

试试这个:

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