在我的项目中,我使用的是Spring和mybatis,mybatis-spring将它们粘在一起。我在服务层周围使用Spring的声明式@Transactional注释,调用mybatis映射器。
我希望在没有活动事务的情况下调用我的mapper方法。相反,他们在无交易的环境中悄悄地运行(否则他们开始新的交易)。
有没有办法禁用此行为并使其更像MANDATORY传播级别?
答案 0 :(得分:1)
最简单的方法是创建自定义TransactionFactory
,它将检查是否存在活动事务,否则抛出异常。
class MandatoryTransactionSpringManagedTransactionFactory extends SpringManagedTransactionFactory {
public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {
if (!TransactionSynchronizationManager.isActualTransactionActive()) {
throw new IllegalTransactionStateException(
"No existing transaction found during mapper invocation");
}
return super.newTransaction(dataSource);
} }
应该用于配置org.mybatis.spring.SqlSessionFactoryBean