0

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

>>> 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”,但隔离级别仍保持可重复读取。我错过了什么吗?

4

2 回答 2

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

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

于 2015-12-10T04:23:11.450 回答
0

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

这是因为

select @@session.tx_isolation

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

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

之前

START TRANSACTION

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

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

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

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

于 2015-12-09T23:33:55.463 回答