Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
Python mysql concurent access:执行锁定以避免任何更新RAW的选择_Python_Mysql - Fatal编程技术网

Python mysql concurent access:执行锁定以避免任何更新RAW的选择

Python mysql concurent access:执行锁定以避免任何更新RAW的选择,python,mysql,Python,Mysql,我想为表的每个raw应用一个并行和并发进程,每个进程都必须采用唯一的raw。 我有一个mysql表,它有一个名为trigger的默认空字段值。在每个并行进程开始时,该进程选择一个空的原始数据,其中包含: SELECT table_id from table where trigger is Null limit 1 然后,在第二个请求中,流程立即执行更新: UPDATE table set trigger = 1 where table_id = [#previous_select_table

我想为表的每个raw应用一个并行和并发进程,每个进程都必须采用唯一的raw。 我有一个mysql表,它有一个名为trigger的默认空字段值。在每个并行进程开始时,该进程选择一个空的原始数据,其中包含:

SELECT table_id from table where trigger is Null limit 1
然后,在第二个请求中,流程立即执行更新:

UPDATE table set trigger = 1 where table_id = [#previous_select_table_id]

在该过程中,通常情况下,每个过程的每个原始数据都会有所不同。我遇到的问题是,有时,在两个选择和更新请求之间,两个或多个进程可以选择相同的空raw,因为它们没有时间更新raw和set值。您是否有任何想法如何在同一查询或其他想法中进行选择和更新,以确保不能在同一时间选择原始数据?我使用python。非常感谢

第一个问题是这是两个独立的交易。因此,第一步是将它们合并为一个

START TRANSACTION
SELECT table_id from table where trigger is Null limit 1 FOR UPDATE
[do stuff]
UPDATE table set trigger = 1 where table_id = [#previous_select_table_id]
COMMIT
第二个方面是选择未处理数据并将其从队列中移除的形式。数据库实现队列对他们来说不是一件自然的事情。使用RabbitMQ等消息队列。即使您在查询中只放了一个表id


还要小心使用保留字,如表列的触发器。

第一个问题是这是两个独立的事务。因此,第一步是将它们合并为一个

START TRANSACTION
SELECT table_id from table where trigger is Null limit 1 FOR UPDATE
[do stuff]
UPDATE table set trigger = 1 where table_id = [#previous_select_table_id]
COMMIT
第二个方面是选择未处理数据并将其从队列中移除的形式。数据库实现队列对他们来说不是一件自然的事情。使用RabbitMQ等消息队列。即使您在查询中只放了一个表id


还要注意在表列中使用诸如触发器之类的保留字。

今天早些时候我回答了几乎相同的问题:我看到了您类似的问题。丹布莱克的回答很好,因为它一直在工作;我们不必再次检查流程是否为unic。我不知道如何开始交易,这当然是我想要的,在同一时间合并多个请求。我推出了这个方法,绝对没有双打!谢谢你,丹布莱克!今天早些时候我回答了几乎相同的问题:我看到了你类似的问题。丹布莱克的回答很好,因为它一直在工作;我们不必再次检查流程是否为unic。我不知道如何开始交易,这当然是我想要的,在同一时间合并多个请求。我推出了这个方法,绝对没有双打!谢谢你,丹布莱克!