为什么win_transaction不会设置事务隔离级别?

时间:2015-12-09 22:47:52

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

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',)

尽管将隔离级别设置为“SERIALIZABLE”,但隔离级别仍然是REPEATABLE-READ。在start_transaction电话中。 我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

SELECT TRX_ISOLATION_LEVEL
  FROM information_schema.innodb_trx
 WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();

这应该为您提供当前事务的隔离级别。但是,除非您START TRANSACTION WITH CONSISTENT SNAPSHOT;,否则在InnoDB看到您运行至少一个查询之后,此事务才会显示在此处。

答案 1 :(得分:0)

我似乎找到了自己问题的答案。

这是因为

select @@session.tx_isolation

返回"会话事务隔离",实际上并不总是当前的事务隔离级别。如果您发出

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

之前

START TRANSACTION

交易将是SERIALIZABLE,但@@ session.tx_isolation保持不变。

"会话事务隔离"在开始交易之前没有指定隔离时,似乎是交易的默认值。

他们在这里说,找不到当前的交易隔离级别是不可能的:

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