【问题标题】:Is it possible to check for db updates before performing db.rollback() within a worker transaction?是否可以在工作事务中执行 db.rollback() 之前检查数据库更新?
【发布时间】:2016-09-27 00:06:12
【问题描述】:

我在 python 中使用队列对 MySQL 数据库的事务进行排队。我正在使用 autocommit=False 以便在并非所有数据查询都正确执行的情况下回滚事务。

我想知道是否可以在执行 db.rollback() 之前检查工作人员是否对数据库执行了操作?或者即使工作人员没有对数据库执行任何操作而没有发生任何错误,您也可以执行 db.rollback 吗?

谢谢!

【问题讨论】:

    标签: python mysql transactions


    【解决方案1】:

    如果我已经正确理解了这个问题,那么在没有发生任何其他事情的情况下回滚事务不是错误,尽管尝试回滚错误当不存在交易时。要判断是哪种情况,您可以测试MySQLConnection.in_transaction property

    【讨论】:

    • 如果连接是用autocommit = false初始化的,是不是马上就有事务了?
    【解决方案2】:

    如果你发出一个

    START TRANSACTION;
    

    (使连接与autocommit = false相同),发送命令

    ROLLBACK WORK;
    

    (另见https://dev.mysql.com/doc/refman/5.5/en/commit.html) 返回

    0 row(s) affected
    

    因此,这意味着,您可以安全地回滚空事务(在 MySQL 5.1.49-3 上测试)。

    或者,您总是可以在工作人员中存储一个本地/静态变量,该变量使用false 进行初始化。如果工作人员至少发出了一个更新命令,则将此变量设置为true

    如果你以后要决定是否要ROLLBACK,你只需要看看变量:如果是true,你就知道你已经通过DB通道发送了至少一个更新命令。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多