2011-06-14 40 views
0

我在Python中使用MySQLdb。如何在.commit后获得实际的cursor.rowcount?

我有可能成功也可能失败的更新:

 
    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,但是你真的不知道是否真的发生了什么,直到你执行一个.commit )。

我的问题:

  • 在MySQL中是一个UPDATE中本身原子?也就是说,如果上述相同的UPDATE(使用不同的PID值,但具有相同的REQUESTED_ROW_ID)在“一次”发送到同一个MySQL服务器,我是否保证一个会成功,另一个会失败?
  • 有没有办法知道,叫“conn.commit()”之后,是否有一个有意义的改变与否? **我可以为实际的提交操作获得可靠的.rowcount吗?
  • 是否.commit操作中发送实际的查询(SET的和WHERE条件不变,)还是只是在受影响的行进行套,独立,鼓舞他们的WHERE子句?
  • 我的问题被.autocommit整齐地解决了吗?

回答

0

上打开autocommit

commit操作只是“确认”更新已经完成。替代方案是rollback,它可以“解除”已经做出的更新。

相关问题