1

我需要运行多个会话来选择 MySQL 中的行。在每个会话中,我首先选择带有flag=0. 之后,我flag=1为这些行设置。同时,我运行另一个会话(或更多会话),它做同样的事情。但是,我担心一个会话中的选择可能会与其他会话发生冲突。我能做些什么来避免这种冲突吗?

我正在使用 Python 和 Django 框架进行编程。Python 或 Django 是否有类似“同步”的命令来确保这两个会话不冲突?

4

1 回答 1

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 并一次处理一行。但它应该适用于多行。

于 2013-07-05T21:19:31.263 回答