在使用spring进行集成测试时,一般会使用@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)自动回滚事务,但是如果遇到REQUIRES_NEW事务,那么这个事务是不会回滚的。
1、通过覆盖其事务传播属性来完成,即如开发环境的事务属性配置如下:
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="doReweight" propagation="REQUIRES_NEW"/> <tx:method name="doClear*" propagation="REQUIRES_NEW"/> <tx:method name="doSend*" propagation="REQUIRES_NEW"/> <tx:method name="doBatchSave*" propagation="REQUIRES_NEW"/> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--> <tx:method name="get*" propagation="REQUIRED" read-only="true"/> <tx:method name="count*" propagation="REQUIRED" read-only="true"/> <tx:method name="find*" propagation="REQUIRED" read-only="true"/> <tx:method name="list*" propagation="REQUIRED" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
在测试时覆盖掉即可:
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--测试时 使用REQUIRED--> <tx:method name="doReweight" propagation="REQUIRED"/> <tx:method name="doClear*" propagation="REQUIRED"/> <tx:method name="doSend*" propagation="REQUIRED"/> <tx:method name="doBatchSave*" propagation="REQUIRED"/> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--> <tx:method name="get*" propagation="REQUIRED" read-only="true"/> <tx:method name="count*" propagation="REQUIRED" read-only="true"/> <tx:method name="find*" propagation="REQUIRED" read-only="true"/> <tx:method name="list*" propagation="REQUIRED" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
但是如果是@Transactional注解的事务那么就无法解决了。
2、使用spring profile测试
还一种方式就是配置spring的profile也可以,上述配置也有点类似profile。
3、使用我提供的工具类,在测试时移除异步支持即可。
//移除异步支持 if(AopProxyUtils.isTransactional(messageApi)) { AopProxyUtils.removeTransactional(messageApi); }
此工具类请参考《使用Aop工具类诊断常见问题》
4、包级别方法测试
@Transactional(propagation = Propagation.REQUIRES_NEW) public void sendSystemMessage() { sendSystemMessageInner(); } void sendSystemMessageInner() { //测试时测试这个方法即可 }
此时测试sendSystemMessageInner即可。这种方式不管是注解还是声明都好用
其实更好的做法是spring内部提供支持,支持这样Requires_New事务的测试。
相关推荐
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果...
2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务 4、Propagation.NOT_SUPPORTED 自身不会开启事务,...
@see Propagation#REQUIRES_NEW 创建一个新的事务,如果当前有事务,则挂起 例:a方法调用b方法,不论a有没有事务,b都会新建一个事务 @see Propagation#NOT_SUPPORTED 不支持事务,如果当前有事务则挂起 例:a方法...
REQUIRES_NEW:创建一个新的事务,并在该事务中执行;如果当前存在事务,则将当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。 NEVER:以非事务方式执行操作,如果当前...
主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务...PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER PROPAGATION_NESTED
彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROP
可以对方法进行注释以指示它们是否需要打开新事务 (@REQUIRES_NEW) 或它们是否可以使用已由其他方法打开的事务 (@REQUIRED)。 每个事务都与打开它的线程的标识符相关联,以保证事务管理器的线程安全操作。 使用@...
REQUIRES_NEW)的情况。 我的测试代码中的实体管理器用于处理生产代码中定义的实体。 要测试 jms-messages 的流,以确定性的方式抛出任意数量的 Messagedriven beans。 使用多个线程来模拟生产情况并正确处理数据库...
事务的传播行为设置为REQUIRES NEW, 26 事务的隔离级别设置为DEFALIT 26 在applicationContext.xml中配置文件通知 27 JDBC 28 Text测试类 29 Hibernate.cfg.xml 31 AOP方法的通知 31 单独前置通知 31 单独后置通知 ...
该组件注册具有众所周知的传播功能(requires,requireNew,never,...)的TransactionHelper OSGi服务。 版本之间的差异 版本1.0.1 1.0.x版本(从1.0.1开始)与Java 5兼容。 在回滚或setRollbackOnly期间发生异常...