当前位置: 首页 > 知识库问答 >
问题:

设置默认回滚规则时,事务回滚不与propagation.requires_new一起工作

艾焕
2023-03-14

我使用MyBatis 3.4.5和Spring 4.1.6。我检查了抽象类GenericException(扩展Exception)和CustomException(扩展GenericException我在德克萨斯州为GenericException设置了默认回滚:

<tx:advice id="txSetRollBackForCoreExceptionsAdvice" transaction-manager="transactionManager">
  <tx:attributes>
      <tx:method name="*" rollback-for="RuntimeException,xxx.exceptions.GenericException"/>
  </tx:attributes>
</tx:advice>
 @Override
public Long push(TimerState timerState) {
    try {
        return timerStatePushService.pushEvent(timerState);
    }catch (Exception e) {
        throw  new TimerException(e.getMessage());
    }
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Service
public class TimerStatePushServiceBean implements TimerStatePushService {
@Autowired
PushService pushService;

@Override
public Long pushEvent(TimerState timerState) throws GenericException {
        return pushService.pushEventById(timerState.getId());
}
12:42:48.677 TRACE {pool-15-thread-1} [o.s.t.i.RuleBasedTransactionAttribute] : Applying rules to determine whether transaction should rollback on xxx.exceptions.CustomException
12:42:48.677 TRACE {pool-15-thread-1} [o.s.t.i.RuleBasedTransactionAttribute] : Winning rollback rule is: null
12:42:48.677 TRACE {pool-15-thread-1} [o.s.t.i.RuleBasedTransactionAttribute] : No relevant rollback rule found: applying default rules
12:42:48.677 DEBUG {pool-15-thread-1} [o.s.j.d.DataSourceTransactionManager] : Global transaction is marked as rollback-only but transactional code requested commit
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = GenericException.class)
@Service
public class TimerStatePushServiceBean implements TimerStatePushService {
@Autowired
PushService pushService;

@Override
public Long pushEvent(TimerState timerState) throws GenericException {
        return pushService.pushEventById(timerState.getId());
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Service
public class TimerStatePushServiceBean implements TimerStatePushService {
@Autowired
PushService pushService;

@Override
public Long pushEvent(TimerState timerState) throws GenericException {
        throw new CustomException("msg");
}

我不明白怎么回事。有关信息:我需要在TimerStatePushService中回滚事务,而不是在Service1中回滚事务。

共有1个答案

明越
2023-03-14

我解决问题。我有两个模块:核心和经理。为核心设置:

<aop:config>
        <aop:pointcut expression="within(xxx.core..*) &amp;&amp; @within(org.springframework.stereotype.Service)" id="inCoreServiceCall"/>
        <aop:advisor order="1" advice-ref="txSetRollBackForCoreExceptionsAdvice" pointcut-ref="inCoreServiceCall"/>
    </aop:config>

PushService在核心模块中,另一个服务在manager模块中。我为manager模块添加了设置。

 类似资料:
  • public void A()抛出ApplicationException{ } 这是方法B(): } 显然,如果删除方法B()中的catch块,就不会出现这种行为。现在,我想知道是否有一种方法可以回滚我的事务,即使我捕捉到方法B()中的异常。谢谢!!!!

  • 我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器:

  • 在我的一般问题之后,我有一个使用Spring的特定问题,我想在下面每次执行DAO方法后回滚特定的测试方法。 添加和未能回滚插入 此外,在之前/之后获取连接并回滚也不会产生影响 我应该如何使用TestNG框架回滚单元测试?大多数答案使用JUnit的 我未能使用TestNG自动接线: 但是成功地使用了和include配置类includes jdbcTemplate/DataStource TestNG

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:

  • 问题内容: 我在EJB3无状态会话Bean中使用CMT。另外,我还创建了自己的具有注释“ @ApplicationException(rollback = true)”的异常。 要回滚事务时是否必须使用“ context.setRollbackOnly()”? 我可以通过在bean的public方法内抛出异常来回滚事务吗? 如果是这样(对Q#2的回答是“是”),我是否必须通过在方法中声明异常来将异