行锁定更新

时间:2011-02-11 19:45:20

标签: mysql innodb

我有很多不同实例(云)读取的innodb表

每个实例中的守护进程需要100行来执行此表的“执行操作”,但我不希望2个(或更多)实例执行相同的操作。

所以我有一个“状态”栏(“待办事项”,“正在做”,“完成”)。

实例1:它需要100行,其中status =“todo”...然后我需要将这些行更新为“正在执行”,因此INSTANCE 2,3,.. x不能采用相同的行。

我该怎么做?

拜托,我想要一个没有LOCKING WHOLE表的解决方案,但是只锁定行(那是因为我使用了innodb)......我已经阅读了很多关于它的内容(LOCK SHARE MODE,FOR UPDATE,COMMITs ......)但我没有得到正确的方法......

2 个答案:

答案 0 :(得分:0)

您应该使用LOCK TABLES和UNLOCK TABLES函数来执行此操作:

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

答案 1 :(得分:0)

使用事务,然后在阅读记录时使用SELECT ... FOR UPDATE。 这样您读取的记录就会被锁定。当您获得所有数据时,将记录更新为“正在进行”和COMMIT事务。 也许您缺少的是使用事务或命令的正确顺序。这是一个基本的例子:

BEGIN TRANSACTION;
SELECT * FROM table WHERE STATUS = 'todo' FOR UPDATE;

// Loop over results in code, save necessary data to array/list..

UPDATE table SET STATUS ='doing' WHERE ...;
COMMIT;

// process the data...

UPDATE table SET STATUS ='done' WHERE ...;
相关问题