问题描述
问题流程
//1 任务执行过程中,使用全局的数据库连接对象global.GVA_DB生成了事务
tx:=global.GVA_DB.Begin()
//2 往下执行,调用了另一个函数去创建用户,里面用的是global.GVA_DB创建的用户
CreateUser()
//...
//3 此时使用事务去查找这条数据,查找不到
tx.Where(xxxxx).First(&findUser)
问题分析
在debug这个问题时,我把打印出来的sql语句在数据库执行是可以找到数据的。我就把tx.Where(xxxxx).First(&findUser)
改为了global.GVA_DB.Where(xxxxx).First(&findUser)
,居然解决了。
但是,尝试写个测试用例尝试复现故障现象,却怎么都复现不出来,非常奇怪。
反复测试发现,在执行tx.Where(xxxxx).First(&findUser)
查询语句后,数据库中的用户表变为只读了,这个现象在测试用例中并没有出现,而替换成global.GVA_DB.Where(xxxxx).First(&findUser)
后,没有出现死锁现象。
总结
虽然解决了,但是没有定位到具体问题。发到网上希望能帮到出现同样问题的小伙伴。
如果有查找问题原因的小伙伴欢迎在下方留言!