• SpringMVC 手动控制事务提交


    描述

           事务还是一个比较好的东东,有了这个,我们在做流程性的东西的时候,就会很好,很nice。

    现在看看 SpringMVC 如何实现的,详细请看代码:

    1、配置文件 applicationContext.xml:

    <bean id="txManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource"/>

    2、在需要加事务的方法上加上

    DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx
    .getBean("txManager");
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。
    TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
    try {
    //逻辑代码,可以写上你的逻辑处理代码
    transactionManager.commit(status);
    } catch (Exception e) {
    transactionManager.rollback(status);
    }

    这是在有 ApplicationContext 的情况下、

    3. ApplicationContext 不存在的情况下

        @Autowired

        private DataSourceTransactionManager txManager;

       DefaultTransactionDefinition def = new DefaultTransactionDefinition();

       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔离级别,开启新事务

       TransactionStatus status = txManager.getTransaction(def); // 获得事务状态

    try{
    //逻辑代码,可以写上你的逻辑处理代码
    txManager.commit(status);
    }catch(Exception e){
    txManager.rollback(status);
    }

    3. Spring声明式事务配置

              

    <!-- 事务配置 spring 3.0 -->

    <beanid="transactionManager class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <propertyname="dataSource"ref="dataSource"/>

    </bean>

    <aop:config>

    <aop:pointcutexpression="execution(public * com.*.service.impl.*Impl.*(..))"id="pointcut"/>

    <aop:advisoradvice-ref="txAdvice"pointcut-ref="pointcut"/>

    </aop:config>

    <tx:adviceid="txAdvice"transaction-manager="transactionManager">

    <tx:attributes>

    <tx:methodname="query*"propagation="REQUIRED"read-only="true"/>

    <tx:methodname="find*"propagation="REQUIRED"read-only="true"/>

    <tx:methodname="get*"propagation="REQUIRED"read-only="true"/>

    <tx:methodname="save*"propagation="REQUIRED"/>

    <tx:methodname="add*"propagation="REQUIRED"/>

    <tx:methodname="create*"propagation="REQUIRED"/>

    <tx:methodname="delete*"propagation="REQUIRED"/>

    <tx:methodname="del*"propagation="REQUIRED"/>

    <tx:methodname="remove*"propagation="REQUIRED"/>

    <tx:methodname="modify*"propagation="REQUIRED"/>

    <tx:methodname="update*"propagation="REQUIRED"/>

    <tx:methodname="clear*"propagation="REQUIRED"/>

    </tx:attributes>

    </tx:advice>

  • 相关阅读:
    爬取动态html网页,requests+execjs
    pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理
    博客园啥时候升级了,刚看到
    在浏览器的市场上,IE依然是放弃了,firefox还在继续~~
    jetbrain rider 逐渐完美了,微软要哭了么?
    div层的滑入滑出实例
    关于js的<、>、=、<=、>=的比较
    Jquery实现左右轮播效果
    Html5离线缓存详细讲解
    CANVAS画布与SVG的区别
  • 原文地址:https://www.cnblogs.com/ruiati/p/6027277.html
Copyright © 2020-2023  润新知