行锁定更新

问题描述:

我已经通过很多不同的实例(云)在每个实例行锁定更新

守护程序需要100行“做的事情”这个表格读取InnoDB表,但我不希望2(或更多)实例采取相同的事情。

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

实例1:它需要100行,其中状态=“todo”...然后我需要更新这些行asap状态“做”,所以INSTANCE 2,3,.. x不能采取相同的行。

我该怎么办?我想要一个没有LOCKING WHOLE表的解决方案,但锁定行(这是因为我使用innodb)...我已经阅读了很多关于这个(LOCK SHARE MODE,FOR UPDATE,COMMITs ... ),但我没有得到正确的方式...

您应该使用LOCK TABLES和UNLOCK TABLES功能做到这一点:

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

+0

这会冻结其他守护进程。也许数据库的工作与处理相比需要很短的时间,但它会锁定每个人一段时间。为此,行级锁定更合适。 – 2011-02-11 19:53:07

使用事务,然后SELECT ... FOR UPDATE当你阅读的记录。 这样您读取的记录被锁定。当你得到所有的数据更新记录,“做”和交易。 也许你错过了一个事务的使用,或命令的正确顺序。这里是一个基本的例子:

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 ...;