我在 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 是否巧妙地解决了我的问题?