Spring添加声明式事务

一、前言

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

暂时省略......

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

暂时省略......

原文地址:https://www.cnblogs.com/yanguobin/p/11707093.html

时间: 2025-01-22 16:08:00

Spring添加声明式事务的相关文章

spring mvc + mybatis + spring aop声明式事务管理没有作用

在最近的一个项目中,采用springMVC.mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! spring版本:3.0.5 mybatis版本:3.2.2 1.applicationContext.xml配置: mvc + mybatis + spring aop声明式事务管理没有作用" title="spring mvc + mybatis + spring aop声明式事务管理没有作用">2.spr

Spring之声明式事务

在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { //2.开启事务:取消自动提交 conn.setAutoCommit(false); //3.执行数据库操作 chain.doFilter(req,resp); //4.提交事务 conn.commit(); }catch(Exception e) { //5.回滚事务 conn.rollBack

Spring AOP声明式事务的缺陷

Spring AOP声明式事务的缺陷 今天项目验收时遇到的一个问题,记录一下 转载:http://liuu.iteye.com/blog/422810 [问题]        Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务:轻量级,测试起来也简单,嘿!”.不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事.所以,我们“一直用它”. 不过,最近的一个项目里,却碰到

Spring学习之Spring的声明式事务管理详解

声明式事务管理 大多数Spring用户选择声明式事务管理的原因是,这个是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念. Spring声明式事务管理可以在任何环境下使用.只需更改配置文件, 它就可以和JDBC.JDO.Hibernate或其他的事务机制一起工作. Spring的声明式事务管理可以被应用到任何类(以及那个类的实例)上. Spring提供了声明式的回滚规则. Spring允许你通过AOP定制事务行为.(例如,如果需要,你可以在事务回滚中插入定制的行为. 你也可以增

转 Spring @Transactional 声明式事务管理 getCurrentSession

Spring @Transactional声明式事务管理  getCurrentSession   在Spring @Transactional声明式事务管理的配置中,hibernate.current_session_context_class=thread- 这一句是不能加的-加了就会出错..那为什么不能加呢? 那是因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的 先

配置 Spring 的声明式事务

<!-- 1. 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> <

Spring的声明式事务管理&lt;tx:advice/&gt; 有关的设置

<tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传播设置是 REQUIRED 隔离级别是 DEFAULT 事务是 读/写 事务超时默认是依赖于事务系统的,或者事务超时没有被支持. 任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚 这些默认的设置当然也是可以被改变的. <tx:advi

spring aop 声明式事务管理

Spring使用AOP来完成声明式的事务管理   有annotation和xml两种形式 代码和上一篇基本相近,再贴一遍 两个实体类 package com.ouc.wkp.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity(name = "t_log") public class Log { priva

spring的声明式事务

事务的传播特性 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败.那么事务的传播特性也是从这里说起的.如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用