最近发现在我们的测试环境django事务失效了--!
大概类似于下面这样
from app1.models import Region
from django.db import transaction
r,_=Region.objects.get_or_create(id=111,name='111')
with transaction.atomic():
r.name='33'
r.save()
raise Exception('11')
执行完到库里查看时,发现库里的name字段已经修改
WTF, django的bug,这代码只能这么简单了。。。
于是重试了django的各个版本,发现django1.11版本之前的没问题,之后的就失效,接着去翻了下django的issue,发现并没有类似的bug,不可能啊,django的2.0版本在两年前就出了,事务不生效算是严重bug呢,怎么可能没人发现。
于是又怀疑测试环境数据库的问题,本地新装了mysql进行测试,这时同样的代码,发现事务又生效了,WTF,WTF.........
怎么回事啊?
接着找到DBA,发现测试环境mysql外新加了层proxysql,那可能是这个的问题哦,于是又一通查,发现proxysql会接收set autocommit=0的命令,但不会送到后端的mysql,就在穷途末路时,去看了下版本的changelog,发现有这样一句描述,丫会忽略set autocommit=0,导致事务根本就没开启,FUCK。
在升级到2.0.8后,再测试就没问题了。
总结:
1、mysql事务必须了解,否则此问题无从查起
2、最终执行是在mysql上,所以打开mysql log日志查看执行的sql语句
mysql> set global general_log = on;
mysql> set global general_log_file='/tmp/general.log';
tail -f /tmp/general.log
3、应该逐渐排除问题,一步步缩小范围
4、proxysql 作为第三方的软件,还是要报怀疑的态度
来源:oschina
链接:https://my.oschina.net/u/914655/blog/3157854