Spring中的事务可分为两种:程控式事务和声明式事务。
Spring不直接管理事务,它只提供事务管理器,将对事务的管理委托给第三方持久平台。
事务管理器 | 第三方持久平台 |
Jdbc.datasource.DataSourceTransactionManager | jdbc |
Orm.hibernate.HibernateTransactionManager | Hibernate2 |
Orm.hibernate3.HibernateTransactionManager | Hibernate3 |
一、程控式事务
二、声明式事务
五个基本特性:1. 传播特性(Propagation) 2. 隔离级别(Isolation) 3. 回滚机制(Rollback Rules) 4. 超时(TimeOut) 5. 只读(Read-Only)
1. Spring支持的传播特性:
传播特性 | 意义 |
PROPAGATION_MANDATORY | 表示该方法一定要在一个事务中运行,没有事务就抛异常。 |
PROPAGATION_NESTED |
|
PROPAGATION_NEVER | 表示该方法不该在一个事务中运行,若当前有事务就抛异常 |
PROPAGATION_NOT_SUPPORTED | 表示该方法不该在一个事务中运行,若当前有事务,在该方法的运行期间,将挂起该事务 |
PROPAGATION_REQUIRED | 必须在一个事务中运行,如果当前已经有事务,就在旧的事务中运行,否则启动一个新的事务。 |
PROPAGATION_REQUIRED_NEW | 一个方法一个事务,没有事务,启动一个新的事务,有事务,挂起旧的事务,现启动一个新的事务。 |
PROPAGATION_SUPPORTS | 一个方法有事务就在事务中运行,没事务就不在事务中运行 |
2. Spring支持的隔离级别
脏读 |
|
不可重复读 | 事务一:select name from test where id = 1; //张三 事务二:update test set name = ‘李四’ where id = 1; 事务一:select name from test where id = 1; //李四 第一次读是“张三”第二次读就变成“李四”了。 |
幻读 | 事务一:update test set name = ‘张三’;//把所有人的姓名都变成张三 事务二:insert into test values(100,’李四’); 事务一:select name from test;//怎么出现李四了。 |
3. Spring默认只支持“运行时”异常的回滚机制,不支持可捕捉异常的回滚。
4.Spring声明式事务的应用