Spring事务管理
- 提供的统一的API接口支持不同的资源
- 提供声明式事务管理
- 方便的与Spring框架集成
- 多个资源的事务管理,同步
Spring 事务抽象
- PlatformTransactionMananger
- TransactionDefinition
事务隔离机制
ISOLATION_DEFAULT
ISOLATION_READ_COMMITTED
ISOLATION_READ_UNCOMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
事务传播机制
PROPAFGATION_REQUIRED(Default)
PROPAFGATION_SUPPORTS
PROPAFGATION_MANDATORY
PROPAFGATION_REQUIRES_NEW
PROPAFGATION_NOT_SUPPORTED
PROPAFGATION_NEVER
PROPAFGATION_NESTEDED - TransactionStatus
@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
Spring JMS事务实例
Spring JMS Session
- 通过Session进行事务管理
原生事务
外部管理的事务:JmsTransactionManager, JTA - 通过Session 是 thread-bound
- 事务上下文:在一个线程中的一个Session
image.png
Spring 事务机制
本地事务
- Spring 容器管理事务的生命周期
- 通过Spring事务接口调用
-
业务代码与具体事务的实现无关
Spring本地事务.png
外部(全局)事务
- 外部事务管理器提供事务管理
- 通过Spring事务接口,调用外部管理器
- 使用JNDI等方式获取外部是刷管理器的实例
- 外部事务管理器一般由应用服务器提供,如Jboss等
外部(全局)事务 -JTA
- 外部事务管理器提供JTA事务管理
- JTA事务管理器可以管理多个数据源
-
通过2阶段提交实现多数据源的事务
Spring外部(全局)事务.png
不使用应用服务器.png
JTA事务管理的用途
服务:
DB
MQ
XA 与 JTA
- Transaction Manager
- XA Resource
-
两阶段提交
XA全局事务管理.png
image.png
-
分布式事务简介
分布式事务是指会涉及到操作多个数据库(或者提供事务语义的系统,如JMS)的事务。其实就是将对同一数据库事务的概念扩大到了对多个数据库的事务。目的是为了保证分布式系统中事务操作的原子性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。 通常把一个数据库内部的事务处理,如对多个表的操作,作为本地事务看待。数据库和JDBC的事务处理对象是本地事务,而分布式事务处理的对象是全局事务。 所谓全局事务,是指分布式事务处理环境中,多个数据库可能需要共同完成一个工作,这个工作即是一个全局事务,例如,一个事务中可能更新几个不同的数据库。对数据库的操作发生在系统的各处,但必须全部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本身操作是否成功,还要依赖与全局事务相关的其它数据库的操作是否成功,如果任一数据库的任一操作失败,则参与此事务的所有数据库所做的所有操作都必须回滚。 一般情况下,某一数据库无法知道其它数据库在做什么,因此,在一个 DTP 环境中,交易中间件是必需的,由它通知和协调相关数据库的提交或回滚。而一个数据库只将其自己所做的操作(可恢复)影射到全局事务中,这个环境就是分布式事务处理模型。
-
分布式事务实现机制
事务包含原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
-
两阶段提交
在分布式系统中,各个节点(或者事务参与方)之间在物理上相互独立,通过网络进行协调。每个独立的节点(或组件)由于存在事务机制,可以保证其数据操作的ACID特性。但是,各节点之间由于相互独立,无法确切地知道其经节点中的事务执行情况,所以多节点之间很难保证ACID,尤其是原子性。如果要实现分布式系统的原子性,则须保证所有节点的数据写操作,要不全部都执行(生效),要么全部都不执行(生效)。但是,一个节点在执行本地事务的时候无法知道其它机器的本地事务的执行结果,所以它就不知道本次事务到底应该commit还是 roolback。常规的解决办法是引入一个“协调者”的组件来统一调度所有分布式节点的执行。
-
XA规范
XA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁。XA引入的事务管理器充当上文所述全局事务中的“协调者”角色。事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源(如数据库或JMS队列)。目前,Oracle、Informix、DB2、Sybase和PostgreSQL等各主流数据库都提供了对XA的支持。
X/Open 组织(即现在的 Open Group )定义了分布式事务处理模型。 X/Open DTP 模型( 1994 )包括应用程序( AP )、事务管理器( TM )、资源管理器( RM )、通信资源管理器( CRM )四部分。 一般常见的事务管理器( TM )是交易中间件,例如JDBC或者hibernate提供的transactionmanager,常见的资源管理器( RM )是数据库,通常就是数据源,例如JDBC或第三方提供的datasource,常见的通信资源管理器( CRM )是消息中间件,如JMS。
XA规范中,事务管理器主要通过以下的接口对资源管理器进行管理
- xa_open,xa_close:建立和关闭与资源管理器的连接。
- xa_start,xa_end:开始和结束一个本地事务。
- xa_prepare,xa_commit,xa_rollback:预提交、提交和回滚一个本地事务。
- xa_recover:回滚一个已进行预提交的事务。
-
两阶段提交原理
二阶段提交的算法思路可以概括为:协调者询问参与者是否准备好了提交,并根据所有参与者的反馈情况决定向所有参与者发送commit或者rollback指令(协调者向所有参与者发送相同的指令)。
所谓的两个阶段是指
-
准备阶段
又称投票阶段。在这一阶段,协调者询问所有参与者是否准备好提交,参与者如果已经准备好提交则回复Prepared
,否则回复Non-Prepared
。 -
提交阶段
又称执行阶段。协调者如果在上一阶段收到所有参与者回复的Prepared
,则在此阶段向所有参与者发送commit
指令,所有参与者立即执行commit
操作;否则协调者向所有参与者发送rollback
指令,参与者立即执行rollback
操作。 -
JTA介绍
作为java平台上事务规范JTA(Java Transaction API)也定义了对XA事务的支持,实际上,JTA是基于XA架构上建模的。在JTA 中,事务管理器抽象为javax.transaction.TransactionManager接口,并通过底层事务服务(即Java Transaction Service)实现。像很多其他的Java规范一样,JTA仅仅定义了接口,具体的实现则是由供应商(如J2EE厂商)负责提供,目前JTA的实现主要有以下几种:
- J2EE容器所提供的JTA实现(如JBoss)。
- 独立的JTA实现:如JOTM(Java Open Transaction Manager),Atomikos。这些实现可以应用在那些不使用J2EE应用服务器的环境里用以提供分布事事务保证。
JTA事务管理的弊端
- 两阶段提交
- 事务时间太长,锁数据的时间太长
- 低性能,低吞吐量
不使用JTA实现多数据源的事务管理
- Spring事务同步机制
- 多个数据源上显示近似事务一致性
- 高性能,高吞吐量
JTA事务实例1 - 单数据源
- 使用Spring JTA事务管理
- Atomikos外部事务管理器提供JTA事务管理
- 使用一个数据库- 单数据源
网友评论