记一次事务隔离级别引起的问题

对于事务问题,其实也是很棘手的,特别是生产环境和测试环境不一样时最为头疼了。比如我最近遇到一个事务隔离级别的问题。先列一下事务的隔离级别吧。

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)

而mysql默认的事务隔离级别为repeatable-read。具体事务细节参考MySQL的四种事务隔离级别,我的问题也是在此文章的基础之上验证的。

我的问题场景是A项目调用B项目,两项目的通信使用的时HTTP,并且各自都开启了事务(数据库时公共的)。当B项目执行完并提交事务,A项目得到响应后去查询B项目的结果,但是查询不到。同事还做了不开启事务的测试,结果是可以查询到的,因此可以得知中间存在事务问题,并且查看了测试环境的事务隔离级别,数据库使用的是——repeatable-read,并且我们仔细检查了代码也没有特别针对事务进行设置,然而生产环境却没有这个问题。那么问题就来了,测试环境的事务隔离级别会是什么情况?为了查清这个问题,我们按照上面”MySQL的四种事务隔离级别“方式去尝试了一下,结果印证了这个问题。简单来说,在默认事务隔离级别情况下两个事务是独立的,不管B事务怎么修改A事务都是不会看到的。那么问题来了,为什么生产环境是可以的呢?于是就查询了一下生产环境的隔离级别——read-committed!!!也就是生产环境只要B事务提交了,A事务是可以看到的。其实使用read-committed是存在事务问题的,但是生产环境已经是这样了,测试环境只能去适应了。

另外,如果需要调整事务隔离级别可以使用这些命令。

  1. 查看当前会话隔离级别
select @@tx_isolation; 
  1. 查看系统当前隔离级别
select @@global.tx_isolation;
  1. 设置当前会话隔离级别
set tx_isolation='read-committed';
  1. 设置系统当前隔离级别
set global transaction isolation level read committed;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

养-乐多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值