@Transactional 是 spring 中的注解。
@DSTransactional 是 mybatis-plus 中的注解。
两者都可以控制事务处理。但不能混用!尤其是在多数据源的情况下,可能会造成事务死锁。
这个问题是怎么发现的呢?在某一次死锁的排查中,在查询数据库的锁的时候,发现对某一个表的锁是一个不同的 sessionId, 和这个事务更新其它表的 sessionId 不一样!代码刚好是在一个事务中同时用到了上面个注解!
public AService {
@Resource
private BService bservice;
@DSTransactional
public void complete(...) {
// 其它操作
bservice.updateBusiness();
}
}
public BService {
@Transactional(rollback = Throwable.class)
public void updateBusiness(...) {
// 其它操作
}
}