实际业务例子:SWPT死锁问题

Posted by Futari on 2023-12-26
Estimated Reading Time 1 Minutes
Words 400 In Total
Viewed Times

首先明确一点,SpringBoot中的隐式事务,都是在执行sql(如mapper)时创建的,属于既定规范。

方法级别管理事务(原子性)

另外有一些不熟悉的,如果sql调用触发器、使用消息队列, JTA(Java Transaction API)分布式事务 等会新开事务

默认当方法正常执行完毕时,事务会自动提交并且关闭事务,但是有时候通过DEBUG时SQL查询发现事务仍存在,未被提交,还需要继续研究。

再明确一点,RPC调用其他的微服务,被调用方的数据库操作是在被调用方开启的事务,不属于当前服务的事务管理器管理范围,即不处于同一个事务边界内。

调用RPC是阻塞的,所以方法内开启事务再调用RPC,需要等待被调方事务提交之后,本地事务再提交

所以不属于任何事务嵌套机制,不在同一管理范围内。

自测使用 PlatformTransactionManager 手动commit,但是事务没有被提交,不知道为什么?可能是初始化initstacktrace出现错误信息,即事务初始化参数错误?

目前解决方式:

1.去除冲突的业务逻辑,使用别的方式,避免被调用方新开事务,直接统一在本地事务解决操作或在被调方统一解决。

2.修改业务逻辑,将发生行锁,表锁的逻辑合并到同一服务(事务边界)内,避免多服务事务发生死锁。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !