前言:
在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下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

 public interface AccountService {

     /**
* 转账的方法
*/
public void transfer(String from,String to,Double money);
}

AccountServiceImpl.java:

     private AccountDao accountDao;

     public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
} @Override
/**
* 业务层转账的方法:
* from:转出账号
* to:转入账号
* money:转账金额
*/
public void transfer(final String from, final String to, final Double money) {
accountDao.outMoney(from, money);
int d = 1 / 0;
accountDao.inMoney(to, money);
} }

  3,DAO层代码
AccountDAO.java:

 public interface AccountDao {
public void outMoney(String from, Double money); public void inMoney(String to, Double money);
}

AccountDAOImpl.java:

 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {

     @Override
public void outMoney(String from, Double money) {
this.getJdbcTemplate().update("update account set money = money - ? where name = ?", money,from);
} @Override
public void inMoney(String to, Double money) {
this.getJdbcTemplate().update("update account set money = money + ? where name = ?", money,to);
} }

  4,配置文件
jdbc.properties:

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

applicationcontext.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置Service -->
<bean id="accountService" class="cn.augmentum.transaction.demo3.service.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean> <!-- 配置DAO -->
<bean id="accountDao" class="cn.augmentum.transaction.demo3.dao.AccountDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 配置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation:事务传播行为:
isolation:隔离级别
read-only:是否为只读事务.
timeout :是否超时.
rollback-for:类似-Exception.发生哪些异常回滚事务.
no-rollback-for:类似+Exception.发生哪些异常不回滚.
-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice> <!-- AOP的配置 -->
<aop:config>
<aop:pointcut expression="execution(* cn.augmentum.transaction.demo3.service.AccountServiceImpl.*(..))" id="pointcut1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref=""/>
</aop:config>
</beans>

  5, 测试方法
SpringDemo.java:

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo3 { @Resource(name="accountService")
private AccountService accountService; @Test
public void demo1(){
accountService.transfer("老马", "凤姐", 1000d);
}
}

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

AccountServiceImpl.java:

 /**
* @Transactional中属性
* propagation:传播行为.
* readOnly:是否只读
* timeout:超时信息
* isolation:隔离级别
*/
@Transactional(propagation=Propagation.REQUIRED,readOnly=false,timeout=-1,isolation=Isolation.DEFAULT)
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
} @Override
/**
* 业务层转账的方法:
* from:转出账号
* to:转入账号
* money:转账金额
*/
public void transfer(final String from, final String to, final Double money) {
accountDao.outMoney(from, money);
int d = 1 / 0;
accountDao.inMoney(to, money);
}
}

applicationcontext.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置Service -->
<bean id="accountService" class="cn.augmentum.transaction.demo4.service.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean> <!-- 配置DAO -->
<bean id="accountDao" class="cn.augmentum.transaction.demo4.dao.AccountDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

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

 

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

  1. Spring 框架的事务管理

    1. Spring 框架的事务管理相关的类和API PlateformTransactionManager 接口: 平台事务管理器(真正管理事务的类); TransactionDefinition 接 ...

  2. Spring框架之事务管理

    Spring框架之事务管理 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性:指事务前后 ...

  3. Spring框架的事务管理之编程式的事务管理(了解)

    1. 说明:Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可!!2.手动编程方式的具体步骤如下: 1.步骤 ...

  4. Spring框架的事务管理相关的类和API

    1. PlatformTransactionManager接口 -- 平台事务管理器.(真正管理事务的类).该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类! 2. Transacti ...

  5. Spring框架的事务管理之基于AspectJ的XML方式(重点掌握)

    1. 步骤一:恢复转账开发环境(转账开发环境见“https://www.cnblogs.com/wyhluckdog/p/10137283.html”) 2.步骤二:引入AOP的开发包3.步骤三:引入 ...

  6. Spring框架的事务管理的分类

    1. Spring的事务管理的分类 1. Spring的编程式事务管理(不推荐使用) * 通过手动编写代码的方式完成事务的管理(不推荐) 2. Spring的声明式事务管理(底层采用AOP的技术) * ...

  7. (三)Spring框架之事务管理

    一.编程式事务管理 Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,事务管理器接口PlatformT ...

  8. Spring框架的事务管理有哪些优点?

    它为不同的事务API  如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式. 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如 它支持声明式事务管理 ...

  9. Spring 框架的事务管理有哪些优点?

    它为不同的事务 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供 一个不变的编程模式. 它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API 它支持声明式 ...

随机推荐

  1. Spring 笔记

    依赖注入(Dependency Injection DI) 通过依赖注入,对象的依赖关系将由系统中负责协调对象的第三方组件在创建对象的时候进行设定.(p6 spring之旅) 在创建类的时候需要依赖的 ...

  2. ulipad源码包配置环境及安装

    一.准备下载的安装包: 1.python(我电脑配置的是2.7)下载地址http://pan.baidu.com/s/1qWrGZk4 2.wxpython(我这里是wxpy3.0,配套python2 ...

  3. mysql远程快速导出csv格式数据工具

    如需转载,请经本人同意. 之前本人曾经写过一个使用 select ....into outfile原理导出数据的脚本,但该脚本值适用于本地快速导出,并不支持远程服务,故又编写了下面这个支持远程导出的脚 ...

  4. vs调试断点进不去的解决办法

    原创文章,禁止转载. 断点进不去的解决办法:  确认是debug版本  确认生成了调试信息  确认在编译和连接的工程配置中指定了相同的匹配的pdb文件名,而不是默认的vc100.pdb等名字(无关) ...

  5. Python 10 —— 杂

    Python 10 —— 杂 科学计算 NumPy:数组,数组函数,傅里叶变换 SciPy:依赖于NumPy,提供更多工具,比如绘图 绘图 Matplitlib:依赖于NumPy和Tkinter

  6. 模板短信接口调用java,pythoy版(二) 阿里大于

    说明 功能:短信通知发送 + 短信发送记录查询,所有参数我没有改动,实测有效! 请自行参考 + 官方API! 短信模板示例:尊敬的${name},您的快递已在飞奔的路上,将在今天${time}送达您的 ...

  7. jsp入门笔记

    jsp语法 1. declaration 由于访问serlvet只有一个,<%! int i = 0; %>   是servlet的变量,刷新时会不断增加 <% int i = 0; ...

  8. Creating a ClickOnce application

    refer to http://www.youtube.com/watch?v=t4BTLdIMYEY

  9. disconf安装部署

    1.client pom文件引入 <dependency> <groupId>com.baidu.disconf</groupId> <artifactId& ...

  10. PHP项目感悟 -- 从CI框架来看iOS的MVC

    其实这几天一直都想找时间把这个感悟整理出来,也是这一段一直思考的问题,因为这一段参加一个PHP后台项目的开发,框架使用的是CI,随着项目的进展,对于CI接触的也越多,但是由于理解的可能并不深刻,我也只 ...