为什么 start_transaction 不设置事务隔离级别?
Why won't start_transaction set the transaction isolation level?
mysql-connector-python
的 MySQLConnection class 的 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',但隔离级别仍保持可重复读取。
我错过了什么吗?
看来我找到了自己问题的答案。
这是因为
select @@session.tx_isolation
returns"session transaction isolation",这实际上并不总是当前的事务隔离级别。如果你发出
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
在
之前
START TRANSACTION
事务将是可序列化的,但@@session.tx_isolation保持不变。
当您在开始事务之前未指定隔离时,"session transaction isolation" 似乎是事务的默认值。
他们在这里说不可能找出当前的事务隔离级别:
SELECT TRX_ISOLATION_LEVEL
FROM information_schema.innodb_trx
WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
这应该为您提供当前事务的隔离级别。但是,除非您 START TRANSACTION WITH CONSISTENT SNAPSHOT;
在 InnoDB 看到您 运行 至少一个查询之后,事务才可能出现在这里。
mysql-connector-python
的 MySQLConnection class 的 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',但隔离级别仍保持可重复读取。
我错过了什么吗?
看来我找到了自己问题的答案。
这是因为
select @@session.tx_isolation
returns"session transaction isolation",这实际上并不总是当前的事务隔离级别。如果你发出
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
在
之前START TRANSACTION
事务将是可序列化的,但@@session.tx_isolation保持不变。
当您在开始事务之前未指定隔离时,"session transaction isolation" 似乎是事务的默认值。
他们在这里说不可能找出当前的事务隔离级别:
SELECT TRX_ISOLATION_LEVEL
FROM information_schema.innodb_trx
WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
这应该为您提供当前事务的隔离级别。但是,除非您 START TRANSACTION WITH CONSISTENT SNAPSHOT;
在 InnoDB 看到您 运行 至少一个查询之后,事务才可能出现在这里。