我需要运行多个会话来选择MySQL中的行。在每个会话中,我首先使用flag=0
选择多个行。之后,我为这些行设置了flag=1
。
同时,我运行另一个会话(或更多会话),它执行相同的操作。但是,我担心一次会议的选择可能会与其他会议产生冲突。
我能做些什么来避免这种冲突吗?
我使用Python编程并使用Django框架。 Python或Django是否有像“同步”这样的命令来确保这两个会话不冲突?
答案 0 :(得分:0)
这种多会话协调不是客户语言的功能;它是DBMS的一个功能。您选择行FOR UPDATE
,然后更新它们并执行您的交易。
要使其工作,您的表需要使用InnoDB(或XtraDB)引擎。 MyISAM无法做到。
您的操作将如下工作:
START TRANSACTION /* this may have its own function call */
SELECT id, whatever
FROM table
WHERE flag = 0
LIMIT 10
FOR UPDATE;
/* do what you need to do with each row selected */
UPDATE table SET flag = 1 WHERE ID = ?id
COMMIT;
如果我这样做,我会考虑使用LIMIT 1并一次处理一行。但它应该适用于多行。