【发布时间】:2018-05-01 20:40:52
【问题描述】:
第一次在 MySQL 中使用事务
python 3.5.2
MySQL 5.7.16
SQL 炼金术
我查看了其他问题/示例,但无法弄清楚为什么以下代码无法按预期运行。
第二个 INSERT 语句失败(特意用于本示例)并且异常处理程序应执行 ROLLBACK。我希望/希望从数据库中删除第一个 INSERT 语句,但它仍然存在。
请有人为我提供正确的解决方案。
def transaction():
conn.execute("SET autocommit = 0;")
conn.execute("START TRANSACTION")
try:
conn.execute("""INSERT INTO ....""")
conn.execute("""INSERT INTO .....""") # this one fails
except:
conn.execute("ROLLBACK")
logging.warning('Exception SQL')
else:
conn.execute("COMMIT")
【问题讨论】:
-
您看到
Exception SQL警告了吗? -
'Exception SQL' 确实填充在日志文件中。 (这只是我在玩弄的东西),所以应该执行 ROLLBACK 语句
-
您不使用 SQLAlchemy 方法(如
session.begin()、session.commit()和session.rollback())的任何原因? -
Barmar 是正确的,您的连接工具会处理事务,事实上,在被告知之前通常不会实际提交(回滚是自动的)。在执行过程中摆脱对交易的任何引用——使用该工具。
-
除了 Barmar 和 SteveJ 的好建议外,还要确保我们插入的表是 InnoDB 而不是 MyISAM。
标签: python mysql exception transactions rollback