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设置如下

    暂时省略......

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

    暂时省略......

  • 相关阅读:
    乐乐的作业
    Spring中配置数据源的5种形式
    乐观锁和悲观锁的区别
    使用Nexus搭建Maven私服
    Maven错误记录
    Maven学习笔记(一)
    Eclipse的SVN插件下载
    SSH整合(Struts2+Spring+Hibernate)
    java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    使用mss2sql将SqlServer转换为Mysql
  • 原文地址:https://www.cnblogs.com/smallfa/p/14028765.html
Copyright © 2011-2022 走看看