【问题标题】:python / mysql - Transactions / Rollback not workingpython / mysql - 事务/回滚不起作用
【发布时间】: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


【解决方案1】:

我没有使用 SQL Alchemy。

我用“mysql-connector-python”尝试了以下代码。

"""
https://stackoverflow.com/questions/47361342/python-mysql-transactions-rollback-not-working

python -m pip install mysql-connector-python
"""
import mysql.connector as m
import logging


def transaction():
    conn = m.connect(host="localhost", user="root",
                     password="", database="wpdc")
    try:
        cursor = conn.cursor()
        cursor.execute("SET autocommit = 0;")
        cursor.execute("START TRANSACTION")

        sql = "INSERT INTO wp_commentmeta (comment_id, meta_key, meta_value) VALUES (%s, %s, %s)"
        val = (100, "John", "John")
        cursor.execute(sql, val)
        val = (101, "Foo", "Bar")
        cursor.execute(sql, val)
    except:
        cursor.execute("ROLLBACK")
        logging.warning('Exception SQL')
    else:
        cursor.execute("COMMIT")
        conn.close()


if __name__ == "__main__":
    transaction()

成功了。

然后我从数据库表中删除了 2 行并将 val = (101, "Foo", "Bar") 更改为 val = (101, "Foo") 以便第二个 cursor.execute(sql, val) 会导致异常。

代码按预期工作。输出是“警告:根:异常 SQL”。数据库表中没有添加任何行。

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 2017-02-18
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多