首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么start_transaction不设置事务隔离级别?

为什么start_transaction不设置事务隔离级别?
EN

Stack Overflow用户
提问于 2015-12-09 22:47:52
回答 2查看 678关注 0票数 0

事务类的MySQLConnection方法似乎不像预期的那样工作。

代码语言:javascript
复制
>>> 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‘,但隔离级别仍然是可重复读取的。我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-09 23:33:55

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

这是因为

代码语言:javascript
复制
select @@session.tx_isolation

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

代码语言:javascript
复制
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

在一个

代码语言:javascript
复制
START TRANSACTION

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-12-10 04:23:11

代码语言:javascript
复制
SELECT TRX_ISOLATION_LEVEL
  FROM information_schema.innodb_trx
 WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34190470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档