【问题标题】:Why won't start_transaction set the transaction isolation level?为什么 start_transaction 不会设置事务隔离级别?
【发布时间】:2016-03-15 09:56:45
【问题描述】:

mysql-connector-python 的 MySQLConnection 类的 start_transaction 方法似乎没有按预期工作。

>>> from mysql.connector import connect
>>> conn = connect(user = 'john', unix_socket = '/tmp/mysql.sock', database='db7')
>>> cur = conn.cursor()
>>> cur.execute("select @@session.tx_isolation")
>>> cur.fetchone()
('REPEATABLE-READ',)
>>> cur.close()
True
>>> conn.start_transaction(isolation_level = 'SERIALIZABLE')
>>> cur = conn.cursor()
>>> cur.execute("select @@session.tx_isolation")
>>> cur.fetchone()
('REPEATABLE-READ',)

尽管在start_transaction 调用中将隔离级别设置为“SERIALIZABLE”,但隔离级别仍保持可重复读取。 我错过了什么吗?

【问题讨论】:

    标签: python mysql python-3.x transactions mysql-connector-python


    【解决方案1】:
    SELECT TRX_ISOLATION_LEVEL
      FROM information_schema.innodb_trx
     WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
    

    这应该为您提供当前事务的隔离级别。但是,除非您START TRANSACTION WITH CONSISTENT SNAPSHOT;,否则在 InnoDB 看到您至少运行一个查询之前,该事务可能不会出现在这里。

    【讨论】:

      【解决方案2】:

      看来我找到了自己问题的答案。

      这是因为

      select @@session.tx_isolation
      

      返回“会话事务隔离”,实际上并不总是当前事务隔离级别。如果你发出一个

      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
      

      之前

      START TRANSACTION
      

      事务将是 SERIALIZABLE,但 @@session.tx_isolation 保持不变。

      当您在开始事务之前未指定隔离时,“会话事务隔离”似乎是事务的默认值。

      他们在这里说不可能找出当前的事务隔离级别:

      https://bugs.mysql.com/bug.php?id=53341

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 2016-01-20
        • 2011-12-17
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多