19Aug/101
关于MySQL事务隔离级别
好吧,今天查一个问题查了一整天……最后发现其实很简单……不过因为过程很艰辛所以不得不记录一下……
问题场景很简单。有两个互相嵌套的事务1和2,2嵌套在1中。事务2插入了一条数据并提交到数据库,事务1尝试获取事务2插入的数据,然后很杯具的失败了~
相信绝大多数人看到这个场景再结合此文标题就会各种知道然后BS我居然要花掉一整天来查这个问题……是的,现在我也是各种知道但是杯具的是当时我各种不知道……
事情的起因是同事写了一个简单注解驱动的多数据源事务管理,于是就拿过来用,然后在写某单元测试的时候发现了这个问题。当然,我第一反应是……这事务管理器靠谱么……于是开始埋头看他的代码(从这里开始我方向已经跑偏了)。看完他的没看爽,又跑去看了一圈ibatis的代码。看完还是嘛原因没找出来……于是去翻mysql日志……翻完更是祭出了端口监听工具抓包分析……
经过上述种种折腾之后……好吧……它不就是因为MySQL的InnoDB默认的数据隔离级别是Repeatable Read而Oracle之流的大多数数据库都是Read Committed么……我只不过是因为被既然都已经提交到数据库了你凭什么不让我读类似这样的惯性思维所影响了嘛(特别是在询问一个MySQL DBA和一个Oracle DBA都没有给我什么建设性建议的情况下……)~
于是在我很用力的敲下了下面的命令后,世界变得更美好了……
mysql> set global transaction isolation level read committed