为啥这个回滚功能不能按预期工作

Posted

技术标签:

【中文标题】为啥这个回滚功能不能按预期工作【英文标题】:Why does this rollback function not work as expected为什么这个回滚功能不能按预期工作 【发布时间】:2020-04-04 01:49:27 【问题描述】:

我将执行 2 个 sql 查询,我想将它们放入一个事务中,如果任何查询失败,则调用 rollback()。代码如下所示,2个查询是

str_trunction: 截断表格 & str_insert: 插入一些行

代码:

try:
        mydb.start_transaction(consistent_snapshot=False,
                               isolation_level=None,
                               readonly=None)
        mycursor.execute(str_truncate)
        mycursor.executemany(str_insert+'ssss', [data[i].values() for i in range(len(data))])
        raise Exception
        mycursor.commit()

except Exception, e:
        mydb.rollback()
        print("Error captured, rollback. \n %s" % e[0])

finally:
        mycursor.close()
        mydb.close()

如图所示,我使用+'ssss'创建了一个异常,当我执行代码时,Exception str Error captured ...如预期显示,这意味着函数rollback()应该被执行。但是,我的表仍然被截断。为什么会发生这种情况?

【问题讨论】:

你在哪里开始你的提交?如果你不开始提交,那么默认情况下你会进入自动提交模式。 【参考方案1】:

在try语句后添加这一行

mydb.autocommit = false

【讨论】:

感谢您的回复,这很有效!但我只是尝试了start_transaction 函数(如主帖中的 shwon)来手动启动事务。但该功能不起作用。为什么... mycursor.execute(str_truncate) 执行然后提交(因为 autocommit 设置为 true)然后 mycursor.executemany(....) 启动并提交另一个事务

以上是关于为啥这个回滚功能不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个正则表达式模式不能按预期工作?

为啥 nodejs 中的睡眠不能按预期工作

为啥 itertools groupby 不能按预期工作? [复制]

为啥使用 Vue 编辑数据不能按预期工作

为啥我的 std::ref 不能按预期工作?

为啥在写入字符串文字时 scanf 不能按预期工作? [复制]