- 事务的基本概念
- Java平台的事务管理(基于connection来管理,connection泛指应用程序和事务资源的通道)
- Spring的事务框架
- 基本原则(让事务管理的关注点和数据访问关注点相分离)
- 事务界定的统一方式PlatformTransactionManager
- 事务的三个主要接口
- 三个核心接口
- TransactionDefinition
- TransactionStatus
- PlatfromTransactionManager(核心组件,界定事务边界的)
- 面向局部事务的PlatformTransactionManager实现类
- 面向全局事务的platformTransactionManager实现类
- 几个前置概念
- 继承结构图
- AbstractPlatformTransactionManager的模板方法之getTransaction()—判断当前事务是否存在,然后做相应判断
- AbstractPlatformTransactionManager的模板方法之rollback()
- AbstractPlatformTransactionManager的模板方法之commit()
- AbstractPlatformTransactionManager的模板方法之suspend()和resume()
- 使用spring的事务管理
- spring的扩展篇
事务的基本概念
四个性质





事务家族成员
全局事务

局部事务


Java平台的事务管理(基于connection来管理,connection泛指应用程序和事务资源的通道)
局部事务支持代码示例


分布式事务支持(基于JTA,java Transaction API)
JTA编程式事务

JTA声明式事务

Java平台事务的问题
局部事务的管理与具体的数据访问方式绑定在一起了(就是每种数据访问方式都是用他们自己的API来管理局部事务)


事务的异常处理

事务处理的API太多

CMT声明式事务的界限

Spring的事务框架
基本原则(让事务管理的关注点和数据访问关注点相分离)
事务管理的关注点(事务界定)
业务层使用事务的抽象API进行事务界定的时候,不用管事务资源是什么,事务资源(javax.sql.connection之类的)的管理由相应的框架实现类来操心
数据访问关注点
数据访问层对可能参与事务的数据资源进行访问的时候,只需要使用相应的数据访问API进行数据访问,不关心当前事务资源如何参与事务或者事务需要参与事务,这个由事务框架来打理。
事务管理抽象API进行事务界定


事务界定的统一方式PlatformTransactionManager
自定义一个PlatformTransactionManager
注意

事务的三个主要接口
三个核心接口
TransactionDefinition
基本属性







继承结构图

TransactionStatus

PlatfromTransactionManager(核心组件,界定事务边界的)
面向局部事务的PlatformTransactionManager实现类

面向全局事务的platformTransactionManager实现类


几个前置概念

继承结构图

AbstractPlatformTransactionManager的模板方法之getTransaction()—判断当前事务是否存在,然后做相应判断




AbstractPlatformTransactionManager的模板方法之rollback()

AbstractPlatformTransactionManager的模板方法之commit()


AbstractPlatformTransactionManager的模板方法之suspend()和resume()


使用spring的事务管理
编程式事务管理
直接使用PlatformTransactionManager(需要自己处理异常)
使用TransactionTemplate

利用TransactionStatus的savepoint创建嵌套事务

声明式事务—TransactionInterceptor
XML元数据驱动的声明式事务
ProxyFactoryBean和TransactionInterceptor(适用于少量Bean)

TransactionProxyFactoryBean(内部持有了一个TransactionInterceptor,适用于少量bean)

使用BeanNameAutoProxyCreator(自动代理机制,不用为每个bean指定接口,target之类的)

使用标签
注解元数据驱动的声明式事务
基本原理

实现

spring的扩展篇
ThreadLocal
理解ThreadLocal的实现

ThreadLocal的应用场景
横向看(ThreadLocal可以跨线程,给多个线程绑定资源的副本)
管理应用程序实现中的线程安全
对于有状态的对象,我们应该给不同的线程分配相应的副本,让他们互相没有干扰。比如connection,每个事务对应于一个connection,如果多个线程同时争用一个connection,那么整个事务管理就有点失控了。
某些情况下的优化
比如有时候多线程到达某个对象就要同步等待这个对象,而这个对象又不是有状态需要共享的,我们就可以给每个线程分配一个这个对象,就可以提高效率,比如:取钱的时候,柜台就是这个对象,我们可以多设置几个柜台。
纵向(ThreadLocal给当前线程设置了,当前线程就可以从线程中获取)
实现线程内的数据传递
比如,同一个事务的多个操作,他们都可以从线程中获取同一个connection
per-thread Singleton
某些资源初始化代价有些大,如果我们每次都有初始化就很老火,所以我们可以第一次初始化就把他放在threadlocals这个变量中,然后以后直接取就可以了
切换多数据源
策略模式(Strategy模式)









