问题描述
|
我在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巧妙地解决吗?
解决方法
打开
autocommit
。
commit
操作只是“确认”更新已完成。替代方法是rollback
,它“撤消”已进行的任何更新。