1.概念
事务是指逻辑上的一组操作,这些操作要么同时执行成功,要么同时执行失败。
2.特性
- 原子性
- 一致性
- 隔离性
- 永久性
3.接口介绍
Spring为事务管理提供了3个高层抽象的接口。
- 平台事务管理器(PlatformTranctionManager):为不同的持久层框架提供了具体的实现类。
- 事务定义(TransactionDefinition):定义事务的隔离级别以及事务传播特性等信息。
- 事务状态(TransactionStatus):获取事务管理过程中产生的相关信息。
4.PlatformTransactionManager接口介绍
Spring为不同的持久化框架提供了不同PlatfromTransactionManager接口实现
- org.springframework.jdbc.datasource.DataSourceTransactionManager:使用Spring JDBC或iBatis进行持久化数据时使用
- org.springframework.orm.hhibernate3.HibernateTransactionManager:使用Hibernate3.0版本进行持久化数据时使用
5.TransactionDefinition
- 脏读(Dirty Read):一个事务读取了另一个事务未提交的数据,但这个数据是有可能回滚的。
- 不可重复读(Unrepeated Read):在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其它事务修改的提交而引起的。例如:事务B中对某个查询执行两次,当第一个执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变。
- 幻读(Phantom read):指当前事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。
事务的隔离级别
- DEFAULT:使用的数据库默认的隔离级别(spring中的选择项)。
- READ_UNCOMMITED:允许读取未提交但已修改的数据,可能导致脏,幻和不可重复读。
- READ_COMMITED:允许在并发事务已经提交后读取。可防止脏读,幻读但不可重复读仍可发生。
- REPEATABLE_READ:对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏,不可重复读但幻读仍可能发生。
- SERIALIZABLE:完全服从ACID的隔离级别,确保不发生脏,幻和不可重读,这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。
事务的传播行为(描述一个由事务传播行为修饰的方法被嵌套进另一个方法时,事务是如何传播的)
public class Demo {
public void method1(){
method2();
}
@Transactional(Propagation = xxx)
public void method2(){
}
}
- PROPAGATION_REQUIRED:支持当前事务,如果不存在,就新建一个。
- PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务。
- PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常。
- PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务。
- PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常。
- PROPAGATION_NESTED:如果当前事务存在,就嵌套事务执行。