一、Spring事务管理相关三个高层抽象接口
1. PlatformTransactionManager 平台相关事务管理器
提供 commit 提交事务、 getTransaction 获取事务状态 、rollback 事务回滚
不同持久层框架,需要不同事务管理器,来提供事务管理代码
JDBC事务管理
开启事务 connection.setAutoCommit(false)
提交事务 connection.commit();
回滚事务 connection.rollback();
Hibernate事务管理
开启事务 session.beginTransaction();
提交事务 session.getTransaction().commit();
回滚事务 session.getTransaction().rollback();
2. TransactionDefinition 事务管理定义信息
TransactionDefinition对象,对应在配置文件中,进行事务管理相关配置信息
getIsolationLevel 获取事务隔离级别
getPropagationBehavior 获取事务传播行为
getTimeOut 获取超时时间
isReadOnly 是否只读
Spring 事务管理,进行配置包括(隔离级别、 传播行为、 超时时间、 是否只读)
什么是事务传播行为?
事务传播行为用于解决2个被事务管理的方法相互调用问题。
事务传播行为解决问题是,两个被事务管理方法互相调用,当一个方法出错时,另一个方法是否回滚
REQUIRED(默认值)、SUPPORTS、MANDATORY : 同一个事务(删除用户、删除订单)
REQUIRES_NEW、NOT_SUPPORTED、NEVER : 处于不同的事务 (ATM取款)
NESTED 嵌套事务:只对DataSourceTransactionManager 有效 ,在同一个事务设置保存点,回滚到保存点,根据业务进行事务提交或者回滚
3. TransactionStatus 事务管理状态信息
flush 刷出、hasSavePoint 是否有保存点、isCompleted 事务是否完成、isNewTransaction 是否为新的事务、isRollbackOnly 事务事务回滚、 setRollbackOnly 事务设置为回滚
小结:
Spring要进行事务管理,使用PlatformTransactionManager 进行事务事务管理,如何管理? 根据TransactionDefinition 定义信息管理 , 在事务管理过程中通过TransactionStatus 查看事务的状态
二、spring事务管理方式
第一种: 编程式事务管理
要手动编写事务管理代码,有代码侵入
1) 在配置文件,配置事务管理器 TransactionManager
2) 将TransactionManager 交给 TransactionTemplate
3) 将TransactionTemplate 注入到代码
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
Object doInTransaction(TransactionStatus status) {
// 需要事务管理的代码
}
});
第二种: 声明式事务管理 (推荐)
只需要通过配置,无需修改原来代码,添加事务管理功能 (底层 AOP 环绕通知)
1) 配置TransationManager
2) 将TransactionManager 交给 TransactionInterceptor 环绕通知
3) 配置切入点和切面
代码如下: