如何在.commit上获得实际的cursor.rowcount?

时间:2011-06-14 00:11:42

标签: python mysql connect mysql-python 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 reads = 1,但你真的不知道是否真的发生过,直到你执行a .commit()。

我的问题:

  • 在MySQL中,它本身是一个UPDATE原子吗?也就是说,如果上面的相同UPDATE(具有不同的PID值,但是相同的REQUESTED_ROW_ID)被“发送”到同一个MySQL服务器,那么我保证一个会成功而另一个会失败吗?
  • 在调用“conn.commit()”之后,有没有办法知道是否有意义的改变? **我可以为实际的提交操作获得可靠的.rowcount吗?
  • .commit操作是否发送实际查询(SET和WHERE条件完好无损),还是仅仅在受影响的行上执行SET,独立于启发它们的WHERE子句?
  • 我的问题是否由.autocommit解决?

1 个答案:

答案 0 :(得分:0)

开启autocommit

commit操作只是“确认”已完成的更新。替代方案是rollback,它“撤消”已经进行的任何更新。