我需要运行多个会话来选择 MySQL 中的行。在每个会话中,我首先选择带有flag=0
. 之后,我flag=1
为这些行设置。同时,我运行另一个会话(或更多会话),它做同样的事情。但是,我担心一个会话中的选择可能会与其他会话发生冲突。我能做些什么来避免这种冲突吗?
我正在使用 Python 和 Django 框架进行编程。Python 或 Django 是否有类似“同步”的命令来确保这两个会话不冲突?
我需要运行多个会话来选择 MySQL 中的行。在每个会话中,我首先选择带有flag=0
. 之后,我flag=1
为这些行设置。同时,我运行另一个会话(或更多会话),它做同样的事情。但是,我担心一个会话中的选择可能会与其他会话发生冲突。我能做些什么来避免这种冲突吗?
我正在使用 Python 和 Django 框架进行编程。Python 或 Django 是否有类似“同步”的命令来确保这两个会话不冲突?
这种多会话协调不是客户端语言的功能;它是 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 并一次处理一行。但它应该适用于多行。