事务的基本概念

四个性质

image.png
image.png
image.png
image.png
image.png

事务家族成员

image.png

全局事务

image.png

局部事务

image.png
image.png

Java平台的事务管理(基于connection来管理,connection泛指应用程序和事务资源的通道)

局部事务支持代码示例

image.png
image.png

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

JTA编程式事务

image.png

JTA声明式事务

image.png

Java平台事务的问题

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

image.png
image.png

事务的异常处理

image.png

事务处理的API太多

image.png

CMT声明式事务的界限

image.png

Spring的事务框架

基本原则(让事务管理的关注点和数据访问关注点相分离)

事务管理的关注点(事务界定)

业务层使用事务的抽象API进行事务界定的时候,不用管事务资源是什么,事务资源(javax.sql.connection之类的)的管理由相应的框架实现类来操心

数据访问关注点

数据访问层对可能参与事务的数据资源进行访问的时候,只需要使用相应的数据访问API进行数据访问,不关心当前事务资源如何参与事务或者事务需要参与事务,这个由事务框架来打理。

事务管理抽象API进行事务界定

image.png
image.png

事务界定的统一方式PlatformTransactionManager

自定义一个PlatformTransactionManager

image.png

注意

image.png

事务的三个主要接口

三个核心接口

image.png

TransactionDefinition

基本属性

image.png
image.png
image.png
image.png
image.png
image.png
image.png

继承结构图

image.png

TransactionStatus

image.png

PlatfromTransactionManager(核心组件,界定事务边界的)

面向局部事务的PlatformTransactionManager实现类

image.png

面向全局事务的platformTransactionManager实现类

image.png
image.png

几个前置概念

image.png

继承结构图

image.png

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

image.png
image.png
image.png
image.png

AbstractPlatformTransactionManager的模板方法之rollback()

image.png

AbstractPlatformTransactionManager的模板方法之commit()

image.png
image.png

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

image.png
image.png

使用spring的事务管理

编程式事务管理

直接使用PlatformTransactionManager(需要自己处理异常)

image.png

使用TransactionTemplate

image.png

利用TransactionStatus的savepoint创建嵌套事务

image.png

声明式事务—TransactionInterceptor

XML元数据驱动的声明式事务

ProxyFactoryBean和TransactionInterceptor(适用于少量Bean)

image.png

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

image.png

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

image.png

使用标签

image.png

注解元数据驱动的声明式事务

基本原理

image.png

实现

image.png

spring的扩展篇

ThreadLocal

理解ThreadLocal的实现

image.png

ThreadLocal的应用场景

横向看(ThreadLocal可以跨线程,给多个线程绑定资源的副本)

管理应用程序实现中的线程安全

对于有状态的对象,我们应该给不同的线程分配相应的副本,让他们互相没有干扰。比如connection,每个事务对应于一个connection,如果多个线程同时争用一个connection,那么整个事务管理就有点失控了。

某些情况下的优化

比如有时候多线程到达某个对象就要同步等待这个对象,而这个对象又不是有状态需要共享的,我们就可以给每个线程分配一个这个对象,就可以提高效率,比如:取钱的时候,柜台就是这个对象,我们可以多设置几个柜台。

纵向(ThreadLocal给当前线程设置了,当前线程就可以从线程中获取)

实现线程内的数据传递

比如,同一个事务的多个操作,他们都可以从线程中获取同一个connection

per-thread Singleton

某些资源初始化代价有些大,如果我们每次都有初始化就很老火,所以我们可以第一次初始化就把他放在threadlocals这个变量中,然后以后直接取就可以了

切换多数据源image.png

策略模式(Strategy模式)

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png