为啥这个回滚功能不能按预期工作
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(....) 启动并提交另一个事务以上是关于为啥这个回滚功能不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章