Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略MySQL查询中的锁定行_Mysql_Locking_Race Condition - Fatal编程技术网

忽略MySQL查询中的锁定行

忽略MySQL查询中的锁定行,mysql,locking,race-condition,Mysql,Locking,Race Condition,我有一个表,由不同的线程同时读取 每个线程必须选择100行,在与数据库无关的每行上执行一些任务,然后必须从表中删除所选行 使用此查询选择行: SELECT id FROM table_name FOR UPDATE; 我的问题是:如何忽略或跳过以前在MySQL中使用select语句锁定的行?我通常创建一个默认为NULL的进程id列,然后让每个线程使用唯一标识符执行以下操作: UPDATE table_name SET process_id = #{process.id} WHERE proce

我有一个表,由不同的线程同时读取

每个线程必须选择100行,在与数据库无关的每行上执行一些任务,然后必须从表中删除所选行

使用此查询选择行:

SELECT id FROM table_name FOR UPDATE;

我的问题是:如何忽略或跳过以前在MySQL中使用select语句锁定的行?

我通常创建一个默认为NULL的进程id列,然后让每个线程使用唯一标识符执行以下操作:

UPDATE table_name SET process_id = #{process.id} WHERE process_id IS NULL LIMIT 100;

SELECT id FROM table_name WHERE process_id = #{process.id} FOR UPDATE;
这确保每个线程从表中选择一组唯一的行


希望这能有所帮助。

即使这不是最好的解决方案,因为我知道没有办法忽略锁定的行,我还是随机选择一行并尝试获得锁定

START TRANSACTION;
SET @v1 =(SELECT myId FROM tests.table WHERE status is NULL LIMIT 1);
SELECT * FROM tests.table WHERE myId=@v1 FOR UPDATE; #<- lock
为事务设置一个小的超时,如果该行被锁定,事务将中止,我将尝试另一个超时。如果我得到锁,我会处理它。如果运气不好,该行被锁定,它将被处理,并且在超时之前解除锁定,然后我选择一个已经“处理”的行!但是,我检查我的流程设置的一个字段,例如status:如果另一个流程事务结束正常,该字段告诉我工作已经完成,我不再处理该行

没有事务的其他所有可能的解决方案,例如,如果行没有状态,则设置另一个字段,并且。。。etc可以很容易地提供竞争条件和错过的进程,例如一个线程突然死亡,分配的数据仍然被标记,而事务过期;参考意见


希望对您有所帮助

在本例中,如果脚本在第一次更新后突然中止,您将如何从旧进程中清除数据库?否则那100行就永远不会被处理好。好问题。我通常设置相同的列或“state”列,以指示作为事务一部分的成功完成。然后,如果一个进程死亡,您可以将一个不存在的进程的任何进程id设置回NULL,以便另一个进程拾取。我更喜欢使用cron作业进行清理,但您也可以将其作为启动新进程的一部分。另一种方法是将locked_设置为时间,您已将记录锁定在。然后,您将修改UPDATE语句以更新进程id为NULL或锁定时间早于某个合理间隔的记录。@KrisRobison您如何将processId创建为processId是唯一的?时间+随机串!抛出一个主机名/id,例如名称空间,这是一个很好的度量标准,但是对于一个完全分布式的锁id,这是可行的。