事务
Spring声明式事务
spring支持的集中事务类型
- PROPAGTION_REQUIRES_NEW:表示当前方法必须在它自己的事务里运行,一个新的事务将被启动,而如果有一个事务正在运行的话,则表示这个方法运行期间被挂起。
- PROPAGTION_NESTED:表示如果当前正有一个事务在运行中,则该方法应该运行在一个嵌套的事务中,被嵌套的事务可以独立于封装事务进行提交或者回滚。
事务增强器
TransactionInterceptor支撑着整个事务功能的架构。
在Spring中支持两种事务处理的方式
- 编程式事务
- 声明式事务
声明式事务的主要处理步骤
- 获取事务的属性
对于事务处理来说,最基础或者说最首要的工作便是获取事务属性了,这是支持整个事务功能的基石,如果没有事务属性,其他功能也无从谈起。 - 加载配置中配置的TransactionManager
- 不同的事务处理方式使用不同逻辑
区别- 编程式事务不需要事务属性
- TransactionManager,CallbackPreferringPlatfrom TransactionManager实现PlatfromTransactionManager接口,暴露出一个方法用于执行事务处理中的回调。
- 在目标方法执行前获取事务并收集事务信息。
- 执行目标方法
- 一旦出现异常,尝试异常处理,默认值针对运行时异常有效
- 提交事务前的事务信息清除
- 提交事务
创建事务
创建事务的步骤
- 获取TransactionAttribute实例
- 获取事务
- 构建事务信息
获取事务
- 获取事务
- 如果当前线程存在事务,则转向潜逃事务的处理
- 事务超时验证
- 事务propagationBehavior属性的设置验证
- 构建DefaultTransactionStatus
- 万三transaction,包括ConnectionHolder,隔离级别,timeout,如果是新链接则绑定到当前线程。