zoukankan      html  css  js  c++  java
  • Spring添加声明式事务 2种方式 1XML配式-- 2注解式

    一、前言

    Spring提供了声明式事务处理机制,它基于AOP实现,无须编写任何事务管理代码,所有的工作全在配置文件中完成。

    第一方式、声明式事务的XML配置方式

    为业务方法配置事务切面,需要用到tx和aop两个命名空间下的标签,先在Spring配置文件中导入这两个命名空间。

    1、配置事务管理器组件

    事务管理器组件提供对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色。这里使用Spring提供的事务管理器类DataSourceTransactionManager来实现,如下

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    配置DataSourceTransactionManager时,要为其注入事先定义好的数据源组件

    2、配置事务增强

    通过<tx:advice>标签配置事务增强,绑定事务管理器并针对不同方法定义事务规则

    复制代码
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="find*" propagation="SUPPORTS"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    复制代码

    其中transaction-manager属性引用和一个事务管理器Bean,transaction-manager属性的默认值是transactionManager,也就是说,如果定义的事务管理器Bean的名称是transactionManager,则可以不用指定该属性值

    通过<tx:attributes>子标签定制事务属性,事务属性通过<tx:method>标签进行设置。Spring支持对不同的方法设置不同的事务属性所以可以为一个<tx:advice>设置多个<tx:method>

    <tx:method>标签中的name属性是必需的,用于指定匹配的方法。若要对方法名进行约定,可以使用通配符(*)。其他属性均为可选,用于指定具体的事务规则,如下

    暂时省略......

    3、配置切面

    最后还要定义切面,将事务增强与方法切入点结合,将事务规则应用到指定的方法上

    复制代码
    <!-- 定义切面 -->
    <aop:config>
        <!-- 定义切入点 -->
        <aop:pointcut id="serviceMethod" expression="execution(* edu.cn.service..*.*(..))"/>
        <!-- 将事务增强与切入点结合 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
    </aop:config> 
    复制代码

    aop:advisor的advice-ref属性引用的是通过<tx:advice>标签设定了事务属性的组件

     

     

     

     

     

    第二方式、声明式事务的注解添加方式

    Spring还支持使用注解配置声明式事务,所使用的注解是@Transactional。首先仍然需要在Spring配置文件中配置事务管理器,并添加对注解配置的事务的支持,如下

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven transaction-manager="txManager"/>

    经过上述配置,程序便支持使用@Transactional注解来配置事务了 

    复制代码
    import org.springframework.transaction.annotation.Transaction
    import org.springframework.stereotype.Service;
    
    @Transaction
    @Service("userService")
    public class UserServiceImpl implements UserService{
        @Autowired
        private UserMapper userMapper;
    
        @Override
        @Transaction(propagation = Propagation.SUPPORTS)
        public List<User> findUsersWithConditions(User user){
            //省略
        }
    
        @Override
        public boolean addNewUser(User user){
            //省略
        }
    }
    复制代码

    在业务类上添加@Transactional注解即可为该类的所有业务方法统一添加事务处理。如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加@Transactional注解进行单独设置。

    @Transactional注解也可以设置事务属性的值,默认的@Transactional设置如下

    暂时省略......

    这些默认值当然也是可以改变的,如下

    暂时省略......

  • 相关阅读:
    NSDate的处理:前一天、后一天等关于时区偏移的处理以及在数据库中的使用
    《powershell 的版本号所引起的载入 FSharp 编译器问题》基本解决
    hdu 2055 An easy problem (java)
    昨天登陆页面,无法进入后台,今天攻克了
    关于ubuntu下qt编译显示Cannot connect creator comm socket /tmp/qt_temp.xxx/stub-socket的解决的方法
    (转)Struts2的拦截器
    (转)Struts2的标签库
    (转)OGNL与值栈
    (转)Struts2访问Servlet的API及......
    (转)Struts2快速入门
  • 原文地址:https://www.cnblogs.com/smallfa/p/14028765.html
Copyright © 2011-2022 走看看