【问题标题】:How do I get the actual cursor.rowcount upon .commit?如何在 .commit 上获得实际的 cursor.rowcount?
【发布时间】:2011-06-14 00:11:42
【问题描述】:

我在 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 是否巧妙地解决了我的问题?

【问题讨论】:

    标签: python mysql connect mysql-python rowcount


    【解决方案1】:

    打开autocommit

    commit 操作只是“确认”更新已经完成。另一种选择是rollback,它会“撤消”已经进行的任何更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      相关资源
      最近更新 更多