您的位置:首页 > 编程语言 > Java开发

spring事务管理

2016-09-07 08:42 288 查看
课程目标:

1.事务的回顾:事务的基本概念和特性

2.spring事务管理的一组API

3.spring的编程式事务管理

4.spring的声明式事务管理

一、事务的回顾

什么是事务?事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

以银行转账为例:



不应该出现张三的钱转成功,但是由于突然断电的原因,李四并没有收到钱,这是不正确的。

所以我们把这整个操作当做一个事务,等他全部成功后,再提交数据commit。

事务的特性:

原子性:是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性:是指事务前后数据的完整性必须保持一致。

隔离性:是指多个用户并发访问数据时,不能发生互相干扰。数据库中可以设置相应的级别用于隔离。

持久性:是指事务一旦被提交,它对数据库中数据的改变是永久的,即使数据库发生故障,也不会有任何影响。

二、事务的API介绍

spring中提供了一系列的接口,用来事务管理。其中包括三个接口:

platform  transaction  manager :平台事务管理器  真正用来管理事务的接口,其中包含了事务的提交和回滚

transaction definition :事务定义信息(隔离,传播,超时,只读)事务操作的隔离级别,是否超时等

transaction status :事务具体运行状态 事务是不是已经提交

三个的联系:

他会首先根据我们事务的定义信息,由平台事务管理器真正进行事务的管理,在管理过程中事务会产生相应的状态,而这些状态就保存在事务具体运行状态中。

platform  transaction  manager :平台事务管理器  

在ssh框架整合中,applicationcontext.xml里面的对事务的配置信息所继承的类就是Hibernate Transaction Manager,而这个类实现的就是platform transaction manager这个接口。

spring为不同的持久化框架提供了不同的platform transaction manager接口实现。

transaction definition :事务定义信息(隔离;传播,超时,只读)

定义了一组常量和方法,包括以isolation开头的五个常量和可以获得隔离级别。

如果不考虑隔离性问题,会引发安全问题如下:

脏读:一个数据读取了另一事务改写但并未提交的数据,如果这些数据被回滚,那么读到的数据是无效的。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。对更新数据而言

幻读:一个事务读取了几行记录,另一事务插入一些数据,这时候幻读就发生了。对插入数据而言

MySQL采用默认的repeatable_read这个级别,而Oracle采用默认的read_committed这个级别。

事务传播行为,用以解决业务层方法之间的相互调用,事务应该加在业务层。

transaction status :事务的状态  保存的就是运行时的一些状态

三、转账环境的搭建

spring支持两种方式事务管理:

编程式的事务管理

在实际应用中很少使用

通过Transaction Template手动管理事务

使用XML配置声明式事务(重点)

开发中推荐使用(代码侵入性最小)

spring的声明式事务是通过AOP实现的

四、基于注解的事务管理

applicationContext.xml里面:

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

<!-- 开始注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

每一个Service上面都要写@Transaction

这样在每一次调用Service层的时候,都使用注解的方法,从而调用applicationContext.xml里面的事务管理,也就是实现HibernateTransactionManager这个类,而该类实现的transaction manager这个接口。这也就说明事务的commit,都交给了系统的一些接口,无须自己提交事务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring api