@@tx_isloation 异常问题解决

@@tx_isloation 异常问题解决

mysql版本升级 5.7.20
mysql把默认事务隔离机制调整Transaction Isolation Level ( mysql 5.7.20 对分布式事务的支持更完美)
需要更改sqlalchemy代码 /site-packages/sqlalchemy/dialects/mysql/base.py 中**get_isolation_level()**函数
注释 cursor.execute('SELECT @@tx_isolation')
更改为一个判断mysql版本 使用不同的隔离级别:

#cursor.execute('SELECT @@tx_isolation')
if self.server_version_info < (5, 7, 20):
    cursor.execute('SELECT @@tx_isolation')
else:
    cursor.execute('SELECT @@transaction_isolation')

mysql事务机制

原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而 使事务不能完成,在rollback时也要消除对数据库得影响!
一致性(Consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b 账户相互转账之后,总金额不变!
隔离性(Isolation):如果多个事务并发执行,应像各个事务独立执行一样!
持久性(Durability):事务提交后被持久化到数据库.

更新丢失:最后的更新覆盖了由其他事务所做的更新
两个人同时独立编辑一份文件,保存更改之后,覆盖原始文件,最后保存其更改的编辑人覆盖另一个 编辑人员所作的更改
脏读:一个事务读取了另一个未提交的并行事务写的数据
一个数据为C=1,事务A把数据改为2,但事务A尚未提交,此时事务B读取数据C,读取到C=2,之后 事务A发生异常,而回滚事务,C=1,最后事务B读取的C=2数据为脏数据,事务B做了一次脏读
不可重复读:一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。
事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录。然后T1又再次读取这行记录 ,发现与刚才读取的结果不同。
幻读:一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生 了改变。
事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录,这行记录恰好可 以满足T1所使用的查询条件中的WHERE 子句的条件。然后T1又使用相同的查询再次对表进行检索, 但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突 然出现的一样

并发事务处理问题::“更新丢失”通常是应该完全避免的。但防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决,因此,防止更新丢失应该是应用的责任。(版本号控制)
“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

  READ UNCOMMITTED:幻读,不可重复读和脏读均允许;      什么都阻止不了
  READ COMMITTED:允许幻读和不可重复读,但不允许脏读; 阻止脏读
  REPEATABLE READ:允许幻读,但不允许不可重复读和脏读; 阻止脏读和不可重复读
  SERIALIZABLE:幻读,不可重复读和脏读都不允许; 	    组织脏读和不可重复读和幻读
  (ORACLE默认的是 READ COMMITTED。  MYSQL默认的是 REPEATABLE READ)
隔离级别越高,受其他事物干扰越少,并发性能越差
  • mysql中设置事务 :

SELECT @@transaction_isolation
set session transaction isolation level 设置事务隔离级别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值