@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(...) {
// 其它操作
}
}