【发布时间】:2011-06-14 00:11:42
【问题描述】:
我在 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 是否巧妙地解决了我的问题?
【问题讨论】:
标签: python mysql connect mysql-python rowcount