Spring应用——事务管理

事务基础:请参看:http://www.cnblogs.com/solverpeng/p/5720306.html

一、Spring 事务管理

1.前提:事务管理器

在使用 Spring 声明式事务管理策略之前,必须配置事务管理器。

Spring 的核心事务管理器的顶级接口是 PlatformTransactionManager。

DataSourceTransactionManager:在应用程序中只需要处理一个数据源,而且通过 JDBC 进行存取。

HibernateTransactionManager:用 Hibernate 框架存取数据。

事务管理器以普通 Bean 的形式生命在 Spring IOC 容器中。如:

<context:property-placeholder location="db.properties"/>

<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
  <property name="driverClass" value="${jdbc.DriverClass}"/>
</bean>

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

2.XML声明式事务管理:Spring 通过 SpringAOP 框架支持声明式事务。

(1)事务管理是一个横切关注点。

(2)具体操作:

<1>在 <beans> 根元素中添加  tx Schema 的约束。可以通过 tx  Schema 中定义的 <tx:advice> 元素声明事务增强。

<tx:advice transaction-manager="transactionManager" id="txAdvice"/>

<2>将增强配置到相应的 Spring AOP 切面。

<aop:config>
  <aop:pointcut id="bookPointcut" expression="execution(* *.BookServiceImpl.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="bookPointcut"/>
</aop:config>

需要注意的是:只有公有的方法才可以添加增强。

3.注解声明式的管理事务:Spring 通过 @Transacational 注解声明式地管理事务

(1)Spring 允许使用 @Transacational 注解来标注事务方法。只能标注公有方法。

(2)可以在方法或类级别添加 @Transactional 注解。当添加到类上时,这个类的所有公有方法都会被定义成支持事务处理的。

(3)Spring Config 文件中的配置:

<1>只需要添加 <tx:annotation-driven/> 节点,并为其指定事务管理器就好了。

<2>指定事务管理器:若事务管理器名称是 transacationManager,就可以在 <tx:annotation-driven/> 节点中省略 transaction-manager 属性。

该元素会自动检测该名称的事务管理器。

<context:property-placeholder location="db.properties"/>

<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
  <property name="driverClass" value="${jdbc.DriverClass}"/>
</bean>

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

<tx:annotation-driven/>

二、Spring 事务传播行为

1.JDBC 提供了事务隔离级别这种解决方案,Spring 对其进行了补充和扩展,就是 事务的传播行为。

2.Spring 提供了七种事务传播行为:

PROPAGATION_REQUIRED、PROPAGATION_REQUIRED_NEW、PROPAGATION_NESTED、PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_MANDATORY

我自己理解的 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRED_NEW :

方法 A 调用方法 B:

(1)如果 A 是一个事务方法,B 也是一个事务方法,那么 B 应该使用自己的事务还是 A 的事务?

如果使用 A 的事务 —— PROPAGATION_REQUIRED

如果使用 B 自己的事务 —— PROPAGATION_REQUIRED_NEW

举个例子来说明:

一个事务:A、B两位同学去饭馆吃饭

中午放学后,A 同学去饭馆吃饭,恰巧刚刚认识的 B 同学也在饭馆吃饭,A 同学是该自己吃呢?还是和 B 同学一起吃呢?

如果是和 B 一起 —— PROPAGATION_REQUIRED

如果是 A 自己吃 —— PROPAGATION_REQUIRED_NEW

(2)如果 A 是一个事务方法,B 不是一个事务方法,那么 B 会使用 A 的事务。

提示:PROPAGATION 意思是 传播

*上面是我自己的理解,没有将所有的情况覆盖,可能自己理解的也有偏差,看到此处的时候请小心求证。

(3)Spring 默认的事务传播行为为 PROPAGATION_REQUIRED

三、Spring 事务其他功能

除了强大的事务传播行为外,Spring 还提供了一些小的附加功能

1.事务超时——为了解决事务时间太长,消耗资源太多的问题,给事务设置一个最大时长,如果超时,则回滚事务。以 秒为单位。

2.只读事务——表示这个事务只读取数据而不更新数据

3.设置事务的回滚属性

默认情况下只检查运行时异常,会导致事务回滚。可以通过 rollbackFor 属性来定义,如果不止一种,可以通过 "," 进行分割。

不论是事务的传播行为还是事务的超时和只读属性,Spring 在 @Transactional 注解中提供了对应的属性。

也可以通过 XML 的方式去配置,如

<tx:advice transaction-manager="transactionManager" id="bookAdvice">
  <tx:attributes>
    <tx:method name="shop" propagation="REQUIRED"/>
  </tx:attributes>
</tx:advice>
时间: 2024-11-05 18:53:10

Spring应用——事务管理的相关文章

spring与事务管理

就我接触到的事务,使用最多的事务管理器是JDBC事务管理器.现在就记录下在spring中是如何使用JDBC事务管理器 1)在spring中配置事务管理器 <!-- JDBC事务 -->    <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property

Spring初学之spring的事务管理xml

所有的java类都是用的上一篇文章:Spring初学之spring的事务管理 不同的是,这时xml配置事务,所以就要把java类中的那些关于spring的注解都删掉,然后在xml中配置,ApplicationContext.xml如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans&q

Spring的事务管理

事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 持久性:一旦结束,数据就永久的保存到数据库 如果不考虑隔离性 脏读:一个事务读到另一个事务未提交数据 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致 虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致 事务的隔离级别

spring笔记--事务管理之声明式事务

事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使用事务: 作为一个受欢迎的企业应用框架,Spring在不同的事务管理API上定义了一个抽象层,而开发时不必了解底层的事务管理API,就可以使用Spring的事务管理机制. Spring既支持编程式的事务管理,也支持声明式的事务管理,大多数情况我们选择后者. 编程式事务管理:将事务管理代码嵌入到业务代

mybatis集成spring的事务管理

第一 创建一个测试实体 1 public class Order { 2 3 private int id; 4 private String orderName; 5 6 public Order(String orderName) { 7 this.orderName = orderName; 8 } 9 10 public int getId() { 11 return id; 12 } 13 public void setId(int id) { 14 this.id = id; 15

Spring初学之spring的事务管理注解

spring的事务管理,本文的例子是:比如你需要网购一本书,卖书的那一方有库存量以及书的价格,你有账户余额.回想我们在编程中要实现买书这样的功能,由于你的账户表和书的库存量表肯定不是同一张数据库表,所以必定会有一个先后,要么先将账户余额扣除书的价格,紧接着将书的库存量减一,要么反过来.那么问题来了,假如我们先将你的账户余额减掉,然后发现书的库存不足,这时怎么办呢,这就需要事务了,当我们发现书的库存不足时就要回滚事务,将你的余额返回去.只要配置了事务,发生了异常,就回滚.这就是事务的回滚.注:新人

深入Spring:自定义事务管理

转自: http://www.jianshu.com/p/5347a462b3a5 前言 上一篇文章讲了Spring的Aop,这里讲一下Spring的事务管理,Spring的事务管理是建立在Aop的基础上的,相比Aop,事务管理的实现耦合性比较小,自定义就比较简单了. 自定义事务 Spring的开启事务管理主要是通过@EnableTransactionManagement注解来实现的.查看源码就会发现,这个注解主要是注入了两个类InfrastructureAdvisorAutoProxyCrea

Spring高级事务管理难点剖析

1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见也是默认的方式. PROPAGATION_SUPPORTS(跟随环境) 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY(需要事务) 使用当前的事务,如果当前没有事务,就抛出异

spring,mybatis事务管理配置与@Transactional注解使用

spring,mybatis事务管理配置与@Transactional注解使用[转] 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基

spring的事务管理注解

软件152班杨锦宏 spring的事务管理,本文的例子是:比如你需要网购一本书,卖书的那一方有库存量以及书的价格,你有账户余额.回想我们在编程中要实现买书这样的功能,由于你的账户表和书的库存量表肯定不是同一张数据库表,所以必定会有一个先后,要么先将账户余额扣除书的价格,紧接着将书的库存量减一,要么反过来.那么问题来了,假如我们先将你的账户余额减掉,然后发现书的库存不足,这时怎么办呢,这就需要事务了,当我们发现书的库存不足时就要回滚事务,将你的余额返回去.只要配置了事务,发生了异常,就回滚.这就是