我有多个数据库,所以我创建了多个事务管理器来管理它们的事务。
我听说@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 );
}
}
2条答案
按热度按时间8i9zcol21#
不确定,但可以尝试ChainedTransactionManager:https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/transaction/ChainedTransactionManager.html
并在这两种方法上使用它
kmynzznz2#
这取决于您的需求的上下文。如果您希望保持数据库中的事务独立,则必须使用REQUIRES_NEW。否则,如果您希望它们在同一事务块下进行管理,则使用REQUIRED就足够了。