我们在生产上出现了多次无法获取到全局锁异常
进一步分析,发现问题出现在释放锁的时候,lock_table表中存在死锁 而死锁的原因居然是,本不该出现在A事务中的lockKeys被保存在了lock_table中,持有了不该他所持有的记录锁 而另一个事务B与事务A触发的时间几乎同时,间隔10ms左右,就出现了B事务等待A事务释放锁,A事务等待B释放另一把锁,造成死锁
我下面提供数据库死锁的日志 deadlock-20230601104213.txt 在文件中,A事务为xid = '10.20.9.15:8091:9315668586294483',我们简称4483 B事务为xid = '10.20.9.15:8091:9315668586294476',我们简称4476
在A事务4483中,可以看到他所持有的锁记录,我们数据查看,是与machine表中的车辆id为10088991相关联,但突然出现了车辆id为10086919的记录,这让人很费解
在B事务4476中,可以看到他所持有的锁记录都是与machine表中的车辆id为10086919相关联,没有出现问题
也就是说,本来应该在B事务中的车辆id为10086919的记录,突然被记录到了在A事务4483中
然后就导致,A事务4483等待B事务4476释放machineborrow表中车辆id为10086919的记录(这条记录本就不该出现在A事务中)
而B事务4476又等待A事务4483释放machine表中的车辆id为10086919的记录(这条记录也不应该出现在A事务中)
我可以很明确事务A和事务B都不是一个接口,处理的业务也不同,只是发生在极短时间内,在seata中居然出现了lockKyes记录串了,导致了业务数据错乱
因为当上述死锁发生后,后续的针对A事务4483的后续操作,machine表中的车辆id为10088991相关的所有处理都无法进行,造成了业务处理脏读,1分钟后,该全局锁被自动释放后,数据全部回滚
Ⅱ. Describe what happenedIf there is an exception, please attach the exception trace:
Just paste your stack trace here!
Ⅲ. Describe what you expected to happen
Ⅳ. How to reproduce it (as minimally and precisely as possible)
- xxx
- xxx
- xxx
Minimal yet complete reproducer code (or URL to code):
Ⅴ. Anything else we need to know? Ⅵ. Environment:- JDK version(e.g.
java -version
): - Seata client/server version:
- Database version:
- OS(e.g.
uname -a
): - Others: