事务的特性
原子性
不可分割
一致性
发生之前和之后事务总额不变
隔离性
不同时对同一事件进行事务处理
持久性
改变后保持不变
高层抽象接口
Spring事务管理高层抽象主要包括三个接口:
事务管理器:
PlatformTransactionManager
事务定义信息(隔离、传播、超时、只读):
TransactionDefinition
事务具体运行状态:
TransactionStatus
接口实现
Spring为不同的持久性框架提供了不同的 PlatformTransactionManager 接口实现
SpringJDBC 或 iBatis 框架
org.springframework.jdbc.datasource.DataSourceTransactionManager
hibernate
org.springframework.orm.hibernate3.HibernateTransactionManager
org.springframework.orm.hibernate4.HibernateTransactionManager
org.springframework.orm.hibernate5.HibernateTransactionManager
JPA
org.springframework.orm.jpa.JpaTransactionManager
JDO
org.springframework.orm.jdo.JdoTransactionManager
JTA
org.springframework.transaction.jta.JtaTransactionManager
隔离性
隔离性中的几个概念:
脏读
一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的
不可重复读
在同一个事务中,多次读取同一个数据返回的结果有所不同
幻读
一个事务读取了几行记录后,另一个事务插入一些数据,幻读就发生了
在后来的查询中,第一个事务就会发现有些原来没有的记录
隔离级别 isolation
事务的隔离级别(四种):
DEFAULT
使用后端数据库默认的隔离级别
MySQL数据库,默认 REPEATABLE_READ
Oracle数据库,默认 READ_COMMITTED
READ_UNCOMMITTED
可能导致 脏读、不可重复读、幻读
READ_COMMITTED
可防止脏读,但不可重复读、幻读仍可能发生
REPEATABLE_READ
可防止脏读和不可重复读,但是幻读仍可能发生
SEPIALIZABLE
完全服从ACID的隔离级别,确保不发生脏读、不可重复读、幻读。
这在所有隔离级别中是最慢的,它是典型的通过完全锁定事务中涉及的数据表来完成的
传播行为 propagation
事务的传播行为:
解决业务层方法之间的相互调用的问题
PROPAGATION_REQUIRED
支持当前事务,如果不存在就新建一个
PROPAGATION_SUPPORTS
支持当前事务,如果不存在就不使用事务
PROPAGATION_MANDATORY
支持当前事务,如果不存在抛出异常
PROPAGATION_REQUIRED_NEW
如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED
以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER
以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED
如果当前事务存在,则嵌套事务执行