zoukankan      html  css  js  c++  java
  • Spring事务管理者与Spring事务注解--声明式事务

    1.在Spring的applicationContext.xml中配置事务管理者

    PS:具体的说明请看代码中的注释

    Xml代码:

        <!-- 声明式事务管理的配置 -->
        <!-- 添加事务管理者的bean -->    
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 -->
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        
        <!-- 通知的配置 -->    
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 指定需要开启并提交事务的方法 -->
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="del*" propagation="REQUIRED" />
                <tx:method name="mod*" propagation="REQUIRED" />
                <!-- 指定以上方法除外的方法是只读的    read-only -->
                <tx:method name="*" propagation="REQUIRED" read-only="true" />
            </tx:attributes>
        </tx:advice>
        
        <!-- 切面的配置(aop原理这里不多说,我的博文中有详细文章) -->
        <aop:config>
            
            <!-- 声明一个切入点 -->
            <aop:pointcut id="interceptorPointCuts" expression="execution(* app.dao.*.*(..))" />
            
            <!-- 引用一个通知并且同时引用一个需要执行的切入点 -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
        </aop:config>

    1_1.运行项目

    程序报错如下:

    org.springframework.beans.factory.BeanDefinitionStoreException

    原因是缺少jar包{org.aopalliance}

    Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor

    1_2.添加jar包,将这4个jar包导入到项目的lib目录下

                         

    2.使用Spring提供的事务注解

    @Transactional [使用事务注解,告诉Spring当前位类中需要事务的开启和提交,注解代码位置可以出现在类定义的前面或者方法上面]

    @Transactional(readOnly=true) [使用事务注解,告诉Spring当前方法不需用到事务,只读]

    类定义的前面声明事务注解,个别不需用到事务的方法设置为只读

    Java代码:

    @Transactional  
    public class BcServiceImpl implements BcService {
        @Autowired
        private BcDao bd;
        
        @Override
        @Transactional(readOnly=true)  
        public List<BookCard> getAllBc() {
            // TODO Auto-generated method stub
            return bd.getAllBc();
        }
    
        @Override
        public String delSingleBc(Integer cid) {
            // TODO Auto-generated method stub
            return bd.delSingleBc(cid);
        }
    
    }

    只在方法上声明事务注解,即每个方法上都进行事务注解的声明

    Java代码:

    public class BcServiceImpl implements BcService {
        @Autowired
        private BcDao bd;
        
        @Override
        @Transactional(readOnly=true)  
        public List<BookCard> getAllBc() {
            // TODO Auto-generated method stub
            return bd.getAllBc();
        }
    
        @Override
        @Transactional
        public String delSingleBc(Integer cid) {
            // TODO Auto-generated method stub
            return bd.delSingleBc(cid);
        }
    
    }

    2_1.在Spring的applicationContext.xml中,添加一个驱动的bean,事务管理者

    【PS:添加事务驱动者的bean后,通知的配置{<tx:advice />}和切面的配置{<aop:config />}都删除掉】

    Xml代码:

        
        <!-- 声明式事务管理的配置 -->
        <!-- 添加事务管理者的bean -->    
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 -->
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        
        <!-- 添加一个驱动的bean,事务管理者 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        

    ---------------------------------------------------

    (over)

  • 相关阅读:
    [置顶] 十年博客行
    计算机编程语言年史
    初步认知MySQL metadata lock(MDL)
    Oracle语句优化规则(二)
    正则表达式
    sql server中的 SET NOCOUNT ON 的含义
    SQO (标准查询运算符)方法 & Linq To Object
    C# 扩展
    特性
    C#之泛型
  • 原文地址:https://www.cnblogs.com/LiJinfu/p/5985114.html
Copyright © 2011-2022 走看看