我有innodb表被许多不同的实例读取(云)
每个实例中的守护进程需要100行来“执行”该表的操作,但我不希望2个(或更多)实例执行相同的操作。
所以我有一个“状态”列("todo",“So”,"done")。
实例1:它需要100行,其中status = "todo“...然后我需要尽快将这些行更新为状态“正在进行”,所以实例2,3,..x不能接受相同的行。
我该怎么做呢?
请,我希望解决方案不锁定整个表,但只锁定行(那是因为我使用innodb)……我读过很多关于这方面的文章(锁共享模式、更新、提交……)但我不明白正确的方法...
发布于 2011-02-12 03:51:17
您应该使用LOCK TABLES和UNLOCK TABLES函数来执行此操作:
http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html
发布于 2011-02-14 16:58:34
使用事务,然后在读取记录时使用SELECT ... FOR UPDATE。这样,您读取的记录将被锁定。当您获得所有数据时,将记录更新为“to”并对事务执行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 ...;https://stackoverflow.com/questions/4973309
复制相似问题