[Spring框架]Spring 事务管理基础入门总结.

前言:
在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 
之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一, 什么是事务

事务是逻辑上一组操作,这组操作要么全都成功,要么全都失败.

事务的属性: ACID
原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据的操作要么全部被执行,要么都不执行.
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态. 一致状态的含义是数据库中的数据应满足为完整性约束.
隔离性(Isolation):多个事务并发执行时, 一个事务的执行不应该影响其他事务的执行.
持久性(Durability):一个事务一旦提交, 他对数据库的修改应该永久保存在数据库中.
  

二, Spring的事务管理

一类:编程式事务管理.手动编写代码管理事务.

二类:声明式事务管理.通过配置完成事务管理.(AOP) : 这里只说声明式的事务管理.

事务管理的API:

PlatformTransactionManager :平台事务管理器

  * 是真正管理事务的对象.

TransactionDefinition :事务定义信息.

  * 定义事务的(隔离级别,传播行为,超时信息,只读)

TransactionStatus :事务状态.

  * 管理事务的过程中,事务有一些状态的改变.状态信息被记录在该对象中.

Spring根据TransactionDefinition中定义的信息使用PlatformTransactionManager管理事务,管理事务过程中产生状态,将状态记录到TransactionStatus中.

 

三, Spring相关API详解
1,
PlatformTransactionManager

2,TransactionDefinition 

常量:

  * ISOLATION_*:定义事务的隔离级别.
  

  * PROPAGATION_*:定义事务的传播行为.
  
  
* 超时信息:
  
方法:

  

Transaction事务状态:
  |

Spring的事务传播行为:

PROPAGATION_REQUIRED :如果A,B操作,如果A有事务使用A的事务将B包含进来.如果A没有事务创建一个新事务将A,B包进来.
PROPAGATION_SUPPORTS    :如果A,B操作,如果A有事务,使用A的事务将B包含进来.如果A没有事务,不使用事务.
PROPAGATION_MANDATORY    :如果A,B操作,如果A有事务,使用A的事务将B包含进来.如果A没有事务,就会抛出异常.

PROPAGATION_REQUIRES_NEW    :如果A,B操作,如果A有事务,将A的事务挂起.创建一个新事务执行B操作.
PROPAGATION_NOT_SUPPORTED    :如果A,B操作,总是以非事务方式运行,如果A有,将A挂起.
PROPAGATION_NEVER :如果A,B操作,总是以非事务方式运行,如果A有事务抛出异常.

PROPAGATION_NESTED    :嵌套事务.如果A,B操作,A有事务,在A执行完之后设置一个保存点.如果B执行没有问题,一起提交.如果B出现问题.允许用户自己控制回滚到最初还是回滚到保存点.

四, Spring事务管理实例(声明式事务管理)

Spring声明式事务管理又可分为三种:
  1,
基于TransactionProxyFactoryBean
   2, 基于AspectJ的XML方式的事务管理
  3, 基于AspectJ的注解方式事务管理

基于AspectJ的XML方式的事务管理:
  1,引入开发包:
  

  2,Service层代码:
AccountService.java

1 public interface AccountService {
2
3     /**
4      * 转账的方法
5      */
6     public void transfer(String from,String to,Double money);
7 }

AccountServiceImpl.java:

 1     private AccountDao accountDao;
 2
 3     public void setAccountDao(AccountDao accountDao) {
 4         this.accountDao = accountDao;
 5     }
 6
 7     @Override
 8     /**
 9      * 业务层转账的方法:
10      *     from:转出账号
11      *     to:转入账号
12      *     money:转账金额
13      */
14     public void transfer(final String from, final String to, final Double money) {
15         accountDao.outMoney(from, money);
16         int d = 1 / 0;
17         accountDao.inMoney(to, money);
18     }
19
20 }

  3,DAO层代码
AccountDAO.java:

1 public interface AccountDao {
2     public void outMoney(String from, Double money);
3
4     public void inMoney(String to, Double money);
5 }

AccountDAOImpl.java:

 1 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
 2
 3     @Override
 4     public void outMoney(String from, Double money) {
 5         this.getJdbcTemplate().update("update account set money = money - ? where name = ?", money,from);
 6     }
 7
 8     @Override
 9     public void inMoney(String to, Double money) {
10         this.getJdbcTemplate().update("update account set money = money + ? where name = ?", money,to);
11     }
12
13 }

  4,配置文件
jdbc.properties:

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_transaction
jdbc.user=root
jdbc.password=123

applicationcontext.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8     http://www.springframework.org/schema/beans/spring-beans.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context.xsd
11     http://www.springframework.org/schema/aop
12     http://www.springframework.org/schema/aop/spring-aop.xsd
13     http://www.springframework.org/schema/tx
14     http://www.springframework.org/schema/tx/spring-tx.xsd">
15
16     <context:property-placeholder location="classpath:jdbc.properties"/>
17
18     <!-- 配置C3P0连接池 -->
19     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
20         <property name="driverClass" value="${jdbc.driverClass}"/>
21         <property name="jdbcUrl" value="${jdbc.url}"/>
22         <property name="user" value="${jdbc.user}"/>
23         <property name="password" value="${jdbc.password}"/>
24     </bean>
25     <!-- 配置Service -->
26     <bean id="accountService" class="cn.augmentum.transaction.demo3.service.AccountServiceImpl">
27         <property name="accountDao" ref="accountDao"/>
28     </bean>
29
30     <!-- 配置DAO -->
31     <bean id="accountDao" class="cn.augmentum.transaction.demo3.dao.AccountDaoImpl">
32         <property name="dataSource" ref="dataSource"/>
33     </bean>
34
35     <!-- 配置事务管理器 -->
36     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
37         <property name="dataSource" ref="dataSource"/>
38     </bean>
39
40     <!-- 配置事务增强 -->
41     <tx:advice id="txAdvice" transaction-manager="transactionManager">
42         <tx:attributes>
43             <!--
44                 propagation:事务传播行为:
45                 isolation:隔离级别
46                 read-only:是否为只读事务.
47                 timeout    :是否超时.
48                 rollback-for:类似-Exception.发生哪些异常回滚事务.
49                 no-rollback-for:类似+Exception.发生哪些异常不回滚.
50              -->
51             <tx:method name="transfer" propagation="REQUIRED"/>
52         </tx:attributes>
53     </tx:advice>
54
55
56     <!-- AOP的配置 -->
57     <aop:config>
58         <aop:pointcut expression="execution(* cn.augmentum.transaction.demo3.service.AccountServiceImpl.*(..))" id="pointcut1"/>
59         <aop:advisor advice-ref="txAdvice" pointcut-ref=""/>
60     </aop:config>
61 </beans>

  5, 测试方法
SpringDemo.java:

 1 @RunWith(SpringJUnit4ClassRunner.class)
 2 @ContextConfiguration("classpath:applicationContext.xml")
 3 public class SpringDemo3 {
 4
 5     @Resource(name="accountService")
 6     private AccountService accountService;
 7
 8     @Test
 9     public void demo1(){
10         accountService.transfer("老马", "凤姐", 1000d);
11     }
12 }

关于XML的声明式事务管理就这些了, 那么下面来看下更简单的关于注解的声明式事务管理的做法.;
这里只需要看Service层是如何加注解以及applicationcontext中是怎样配置的就行了.

AccountServiceImpl.java:

 1 /**
 2  * @Transactional中属性
 3  * propagation:传播行为.
 4  * readOnly:是否只读
 5  * timeout:超时信息
 6  * isolation:隔离级别
 7  */
 8 @Transactional(propagation=Propagation.REQUIRED,readOnly=false,timeout=-1,isolation=Isolation.DEFAULT)
 9 public class AccountServiceImpl implements AccountService {
10     private AccountDao accountDao;
11
12     public void setAccountDao(AccountDao accountDao) {
13         this.accountDao = accountDao;
14     }
15
16     @Override
17     /**
18      * 业务层转账的方法:
19      *     from:转出账号
20      *     to:转入账号
21      *     money:转账金额
22      */
23     public void transfer(final String from, final String to, final Double money) {
24         accountDao.outMoney(from, money);
25         int d = 1 / 0;
26         accountDao.inMoney(to, money);
27     }
28 }

applicationcontext.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans
 8     http://www.springframework.org/schema/beans/spring-beans.xsd
 9     http://www.springframework.org/schema/context
10     http://www.springframework.org/schema/context/spring-context.xsd
11     http://www.springframework.org/schema/aop
12     http://www.springframework.org/schema/aop/spring-aop.xsd
13     http://www.springframework.org/schema/tx
14     http://www.springframework.org/schema/tx/spring-tx.xsd">
15
16     <context:property-placeholder location="classpath:jdbc.properties"/>
17
18     <!-- 配置C3P0连接池 -->
19     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
20         <property name="driverClass" value="${jdbc.driverClass}"/>
21         <property name="jdbcUrl" value="${jdbc.url}"/>
22         <property name="user" value="${jdbc.user}"/>
23         <property name="password" value="${jdbc.password}"/>
24     </bean>
25     <!-- 配置Service -->
26     <bean id="accountService" class="cn.augmentum.transaction.demo4.service.AccountServiceImpl">
27         <property name="accountDao" ref="accountDao"/>
28     </bean>
29
30     <!-- 配置DAO -->
31     <bean id="accountDao" class="cn.augmentum.transaction.demo4.dao.AccountDaoImpl">
32         <property name="dataSource" ref="dataSource"/>
33     </bean>
34
35     <!-- 配置事务管理器 -->
36     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
37         <property name="dataSource" ref="dataSource"/>
38     </bean>
39
40     <!-- 开启注解事务 -->
41     <tx:annotation-driven transaction-manager="transactionManager"/>
42 </beans>

注解方式的声明式事务管理也就是这么多, 看起来确实简单了很多.

 

时间: 2024-10-22 18:46:44

[Spring框架]Spring 事务管理基础入门总结.的相关文章

Spring框架的事务管理及应用

Spring框架简介 Spring框架是一个2003年2月才出现的开源项目,该开源项目起源自Rod Johnson在2002年末出版的<Expert One-on-One J2EE Design and Development>一书中的基础性代码.在该书中,Rod Johnson倡导J2EE实用主义的设计思想,而Spring框架正是这一思想的更全面和具体的实现.Spring框架由一个容器,一个配置和组织组件的框架,和一组内置的为事务.持久化和Web用户接口提供的服务组成.作为一种轻量级的J2E

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.

Spring中的事务管理

一.Spring事务管理用到的三个接口 a. PlatformTransactionManager 事务管理器 b. TransactionDefinition 事务定义信息(隔离.传播.超时.只读) c. TransactionStatus 事务具体的运行状态 二.Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现 事务 说明 org.springframework.jdbc.datasource.DataSourceTransactionM

使用Spring配置文件实现事务管理

前面我们讲解了使用Spring注解方式来管理事务,现在我们就来学习使用Spring配置文件实现事务管理.本文是建立在使用Spring注解方式管理事务与传播行为详解案例基础之上的. 首先我们在cn.itcast.service.impl包下再新建一个业务bean——PersonServiceBean2.java,其代码为: /** * 使用JdbcTemplate进行insert/update/delete/select操作 * @author li ayun * */ public class

Spring JdbcTemplate 与 事务管理 学习

Spring的JDBC框架能够承担资源管理和异常处理的工作,从而简化我们的JDBC代码, 让我们只需编写从数据库读写数据所必需的代码.Spring把数据访问的样板代码隐藏到模板类之下, 结合Spring的事务管理,可以大大简化我们的代码. Spring提供了3个模板类: JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问. NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数,而不是使

Spring Cloud 分布式事务管理

Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Cloud 分布式事务管理 单体式架构 微服务架构 优点: 缺点: 分布式事务的引入 分布式事务解决方案 基于XA协议的两阶段提交 消息事务+最终一致性 TCC编程模式 具体实现 LCN ByteTCC 在说微服务的优缺点时,有对比才会更加明显,首先说一下单体式结构 单体式架构 在单体式架构中,系统通常采

Spring对Hibernate事务管理【转】

在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: <property name="hibernate

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

spring 声明式事务管理

简单理解事务: 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元:如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元.所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的. 当这两个步骤提交了,执行完毕