Spring事务管理机制概述
Spring事务管理模块主要包括3个接口
- PlatformTransactionManager:事务管理器,主要用于平台相关的事务管理。
- TransactionDefinition:事务定义信息(隔离级别、传播、超时、只读)通过配置如何进行事务管理。
- TransactionStatus:事务具体运行状态——事务管理过程中,每个时间点事务的状态信息。
1、PlatformTransactionManager:事务管理器
事务管理器接口主要包括了以下3个方法:
- commit():提交事务
- getTransaction():获取事务状态
- rollback():事务回滚
PlatformTransactionManager是事务管理的一个接口,不同的ORM持久化框架对该接口具有不同的实现,使用不同框架时,我们调用不同的实现,如下:
在DataSourceTransactionManager中,使用Connection进行事务管理:
- 开启事务:connection.setAutoCommit(false);
- 提交事务:connection.commit();
- 回滚事务:connection.rollback();
2、TransactionDefinition:事务定义信息
该接口api如下:
隔离级别包括:
- 读未提交
- 读已提交
- 可重复读
- 序列化
以上隔离级别安全性逐一升高,这里不再赘述各个隔离级别的优缺点,详情可搜索数据库事务隔离级别。
这里通过第一个方法可获取当前的隔离级别。
事务的传播行为
事务的传播行为用于解决两个被事务管理的方法的相互调用问题。
它具有7种类型:
主要分为三大类:
- Required(默认)、Supports、Mandatory:支持当前事务,A调用B、若A事务存在,那么B和A处于同一个事务。
- Requires_New、Not_Supported、Never:不支持原来的事务,A调用B、若A事务存在,那么B和A肯定不处于同一个事务。
- Nested:嵌套事务,允许在同一事务设置保存点,回滚保存点。
3、TransactionStatus:事务具体运行状态
同样,该接口的api如下:
其中,isRollbackOnly()多用于测试,有时候我们只需要知道代码能否执行,但又不想真正插入数据框,那么可用该方法进行测试。
无论事务是否回滚,我们终究将执行提交,如下代码:
try{
//操作
}catch(){
//rollback
}finally{
commit();
}
即,我们进行的回滚操作是对已插入数据进行的一次擦除,擦除结束后需要进行最终提交。
三个接口主要关系
- 首先用户管理事务,需要先根据选用的ORM持久层框架配置TransactionManager进行事务管理。
- 然后根据TransactionDefinition(事务定义信息),通过TransactionManager进行事务管理。
- 事务运行过程中,每个时刻都可通过TransactionStatus来了解事务运行状态。
Spring事务管理的两种方式
1. 编程式事务管理
通过TransactionTemplate手动进行事务管理,需要对原有代码进行直接修改,在业务逻辑中加入事务控制的方法,在实际编程中很少使用。
2.使用XML或基于注解的方式进行声明式事务管理
声明式事务管理通过Spring AOP(环绕通知)实现。
也就是说,我们在Spring中进行事务管理,一般仅需在方法上进行声明,其他交给Spring框架自身进行处理即可。
声