如何在.commit后获取实际的cursor.rowcount?

0 投票
1 回答
646 浏览
提问于 2025-04-16 19:30

我在用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,它是用来“撤销”已经做过的更新。

撰写回答