java @Transactional如何在不同的事务管理器上工作?

xoefb8l8  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(155)

我有多个数据库,所以我创建了多个事务管理器来管理它们的事务。
我听说@Transactional的默认传播级别是Propagation.REQUIRED
如果传播级别为REQUIRED,则子事务将加入父事务。
但如果是这样,子事务的事务管理器将成为父事务管理器。
是否正确?还是不同的事务管理器创建自己的事务?

@RequiredArgsConstructor
@Transactional( transactionManager = "mainTransactionManager" )
public class MainService {
  
  private final MainDao mainDao;

  private final SubService subService;

  public void doMain() {
     String result = "Fail";
     try {
       mainDao.update(); // Exception on here, mainTransactionManager will rollback
       result = "Success"
     } finally {
       subService.doSub( result ); // Exception on here, mainTransactionManager & subTransactionManager will rollback
     }
  }

}

@RequiredArgsConstructor
@Transactional( transactionManager = "subTransactionManager" )
public class SubService {
  
  private final SubDao subDao;

  public void doSub( String result ) {
     subDao.update( result );
  }

}
8i9zcol2

8i9zcol21#

不确定,但可以尝试ChainedTransactionManager:https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/transaction/ChainedTransactionManager.html

@Bean 
PlatformTransactionManager chainedTransactionManager() {
  return new ChainedTransactionManager(mainTransactionManager, subTransactionManager);
}

并在这两种方法上使用它

kmynzznz

kmynzznz2#

这取决于您的需求的上下文。如果您希望保持数据库中的事务独立,则必须使用REQUIRES_NEW。否则,如果您希望它们在同一事务块下进行管理,则使用REQUIRED就足够了。

相关问题