zoukankan      html  css  js  c++  java
  • SpringMVC+MyBatis 事务中 基于注解的声明式事务

    spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。初学中,这里记录一下自己学习过程中用到的“基于注解的声明式事务”这种方式

    spring beans.xml配置文件中关于事务部分的配置如下:
    复制代码
    <!-- 5.事务管理 -->
            <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource"/>
            </bean>
            
            <!-- 事务通知 -->
            <tx:advice id="txAdivce" transaction-manager="txManager">
                <tx:attributes>
                    <tx:method name="insert*" propagation="REQUIRED"/>
                    <tx:method name="update*" propagation="REQUIRED"/>
                    <tx:method name="delete*" propagation="REQUIRED"/>
                    <tx:method name="save*" propagation="REQUIRED"/>
                    <tx:method name="add*" propagation="REQUIRED"/>
                    
                    <tx:method name="find*" read-only="false"/>
                    <tx:method name="get*" read-only="false"/>
                    <tx:method name="view*" read-only="false"/>
                </tx:attributes>
            </tx:advice>
            
            <aop:config>
                <aop:pointcut expression="execution(* com.pp.service.*.*(..))" id="txPointcut"/>
                <aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/>
            </aop:config>
            
            <!-- 开启事务注解驱动 -->
            <tx:annotation-driven transaction-manager="txManager" /> 
    复制代码

    首先要开启事务注解驱动

     <!-- 开启事务注解驱动 -->
            <tx:annotation-driven transaction-manager="txManager" /> 

    在aop切面配置节中声明 在哪个包中使用事务,我的例子中声明的是 com.pp.service 包中

     <aop:config>
                <aop:pointcut expression="execution(* com.pp.service.*.*(..))" id="txPointcut"/>
                <aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/>
            </aop:config>

    声明在哪种方法中使用事务

    复制代码
     <!-- 事务通知 -->
            <tx:advice id="txAdivce" transaction-manager="txManager">
                <tx:attributes>
                    <tx:method name="insert*" propagation="REQUIRED"/>
                    <tx:method name="update*" propagation="REQUIRED"/>
                    <tx:method name="delete*" propagation="REQUIRED"/>
                    <tx:method name="save*" propagation="REQUIRED"/>
                    <tx:method name="add*" propagation="REQUIRED"/>
                    
                    <tx:method name="find*" read-only="false"/>
                    <tx:method name="get*" read-only="false"/>
                    <tx:method name="view*" read-only="false"/>
                </tx:attributes>
            </tx:advice>
    复制代码

    如果在<tx:method /> 节中没有声明在程序中使用的方法的话,需要在该方法使用@Transactional注解,如下:

    复制代码
    @Transactional//事务注解,需要在spring 配置文件中开启事务注解驱动
        public void add(SysRole role, String[] permissionIds) {
            this.insert(role);
            int a = permissionIds.length;
            List<SysRoleAuthorize> lst = role.getLstAuthorize();
            if (lst != null) {
                for (SysRoleAuthorize entity : lst) {
                    entity.setfId(UUID.randomUUID().toString());
                    entity.setfObjecttype(1);
                    entity.setfObjectid(role.getfId());
    
                    daoAuthorize.insert(entity);
                }
            }
        }
    复制代码

    如果不在方法上面使用@Transactional注解,那么需要在tx:advice节中增加如下黄色背景的方法声明

    复制代码
     <!-- 事务通知 -->
            <tx:advice id="txAdivce" transaction-manager="txManager">
                <tx:attributes>
                    <tx:method name="insert*" propagation="REQUIRED"/>
                    <tx:method name="update*" propagation="REQUIRED"/>
                    <tx:method name="delete*" propagation="REQUIRED"/>
                    <tx:method name="save*" propagation="REQUIRED"/>
                    <tx:method name="add*" propagation="REQUIRED"/>
                    
                    <tx:method name="find*" read-only="false"/>
                    <tx:method name="get*" read-only="false"/>
                    <tx:method name="view*" read-only="false"/>
                </tx:attributes>
            </tx:advice>
            
    复制代码

    这里的name=“add*”对应的就是java代码中的add方法

    本文来自博客园,作者:Forever丶随风,转载请注明原文链接:https://www.cnblogs.com/Forever-wind/p/11663248.html

  • 相关阅读:
    Apache+PHP多端口多站点
    异步将远程链接上的内容(图片或内容)写到本地--微信头像
    如何判断微信内置浏览器(JS & PHP)
    阿里大于(阿里大鱼)短信发送
    商城分类表-二级,内容较全
    ajax省市县三级联动
    html5自带表单验证-美化改造
    thinkphp使用自定义类方法
    thinkphp模板中for循环与switch的使用
    css揭秘之按钮的实现技巧
  • 原文地址:https://www.cnblogs.com/Forever-wind/p/11663248.html
Copyright © 2011-2022 走看看