django事务失效问题的解决

自古美人都是妖i 提交于 2020-02-26 19:24:34

最近发现在我们的测试环境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 作为第三方的软件,还是要报怀疑的态度

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!