mysql 并发访问 :执行锁定以避免任何用于更新原始数据的选项



我想为表的每个原始应用一个并行和并发的进程,并且每个进程都必须采用唯一的raw.
我有一个mysql表,其中包含一个名为trigger的默认Null字段值。在每个并行进程的开头,进程选择具有以下功能的 Null 原始数据:

SELECT table_id from table where trigger is Null limit 1

然后立即在第二个请求中,进程进行更新:

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

随着这个过程,通常,每个过程的每个原始数据都会有所不同。我遇到的问题是,有时,在两个请求(选择和更新(之间的时间内,两个或多个进程可以选择相同的空原始,因为它们没有时间更新原始和设置值。您是否有任何想法如何在同一查询或其他想法中进行选择和更新,以确保无法在同一时间内选择原始数据?我使用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 或其他。即使您放在查询上的所有内容都是table_id。

还要小心使用保留字(如trigger(作为表列。

最新更新