`
jinnianshilongnian
  • 浏览: 21435360 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405208
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997857
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631575
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257590
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593252
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248993
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847698
Group-logo
跟我学Nginx+Lua开...
浏览量:698206
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780544
社区版块
存档分类
最新评论

如何测试REQUIRES_NEW事务

 
阅读更多

在使用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事务的测试。

2
0
分享到:
评论

相关推荐

    Spring 事务配置的五种方式.docx

    PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果...

    Spring事务传播特性解析

    2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务 4、Propagation.NOT_SUPPORTED 自身不会开启事务,...

    注入JdbcTemplate启用事务管理.docx

    @see Propagation#REQUIRES_NEW 创建一个新的事务,如果当前有事务,则挂起 例:a方法调用b方法,不论a有没有事务,b都会新建一个事务 @see Propagation#NOT_SUPPORTED 不支持事务,如果当前有事务则挂起 例:a方法...

    Spring框架+Spring中的事务

    REQUIRES_NEW:创建一个新的事务,并在该事务中执行;如果当前存在事务,则将当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。 NEVER:以非事务方式执行操作,如果当前...

    Spring异常捕获且回滚事务解决方案

    主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    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

    EJBContainer:EJB 容器的个人实现

    可以对方法进行注释以指示它们是否需要打开新事务 (@REQUIRES_NEW) 或它们是否可以使用已由其他方法打开的事务 (@REQUIRED)。 每个事务都与打开它的线程的标识符相关联,以保证事务管理器的线程安全操作。 使用@...

    java8看不到源码-ioc-unit:使用jpa、resteasy、ejb、jta、jms、validation为部署创建测试的工具箱,

    REQUIRES_NEW)的情况。 我的测试代码中的实体管理器用于处理生产代码中定义的实体。 要测试 jms-messages 的流,以确定性的方式抛出任意数量的 Messagedriven beans。 使用多个线程来模拟生产情况并正确处理数据库...

    spring考试通过必备材料.docx

    事务的传播行为设置为REQUIRES NEW, 26 事务的隔离级别设置为DEFALIT 26 在applicationContext.xml中配置文件通知 27 JDBC 28 Text测试类 29 Hibernate.cfg.xml 31 AOP方法的通知 31 单独前置通知 31 单独后置通知 ...

    transaction-helper:transaction.helper

    该组件注册具有众所周知的传播功能(requires,requireNew,never,...)的TransactionHelper OSGi服务。 版本之间的差异 版本1.0.1 1.0.x版本(从1.0.1开始)与Java 5兼容。 在回滚或setRollbackOnly期间发生异常...

Global site tag (gtag.js) - Google Analytics