如何在.commit后获取实际的cursor.rowcount?
我在用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,而不考虑引发这些SET的WHERE条件?
- 我的问题是否可以通过.autocommit轻松解决?
1 个回答
0
打开 autocommit
功能。
commit
操作就是“确认”已经做过的更新。另一种选择是 rollback
,它是用来“撤销”已经做过的更新。