0

我在 Python 中使用 MySQLdb。

我有一个可能成功或失败的更新:

  UPDATE table
     SET reserved_by = PID
         state = "unavailable"
   WHERE state = "available"
     AND id = REQUESTED_ROW_ID
   LIMIT 1;

正如您可能推断的那样,多个进程正在使用数据库,我需要进程能够为自己安全地抓取行,而不会导致竞争条件导致问题。

我的理论(可能是不正确的)是只有一个进程能够成功使用此查询(.rowcount=1)——其他进程将失败(.rowcount=0)或获得不同的行(.rowcount=1)。

问题是,通过 MySQLdb 发生的一切似乎都发生在虚拟世界中——.rowcount 读取 =1,但在执行 .commit() 之前,您无法真正知道是否真的发生了任何事情。

我的问题:

  • 在 MySQL 中,单个 UPDATE 本身是原子的吗?也就是说,如果上述相同的 UPDATE(具有不同的 PID 值,但相同的 REQUESTED_ROW_ID)被“一次”发送到同一个 MySQL 服务器,我是否保证一个会成功而另一个会失败?
  • 有没有办法知道,在调用“conn.commit()”之后,是否有有意义的变化?** 我可以获得一个可靠的 .rowcount 用于实际的提交操作吗?
  • .commit 操作是否发送实际查询(SET 和 WHERE 条件完好无损),还是仅在受影响的行上执行 SET,独立于启发它们的 WHERE 子句?
  • .autocommit 是否巧妙地解决了我的问题?
4

1 回答 1

0

打开autocommit

commit操作只是“确认”已经完成的更新。另一种方法是rollback,它“撤消”已经进行的任何更新。

于 2011-06-14T04:53:27.723 回答