Java事务从事务的实现角度分为:JDBC事务、JTA(Java Transaction API)事务、容器事务。从事务管理的角度,可以把Java中用到的事务分为本地事务和全局事务。
本地事务不用事务的编程框架来管理事务,直接使用资源管理器来控制事务。典型的就是java.sql.Connection中的setAutoCommit、commit、rollback方法。
全局事务是由资源管理器管理和协调的事务,它可以跨越多个数据库和进程,是一个标准的分布式事务。全局事务是一个DTP模型的事务,所谓DTP模型指的是X/Open DTP(X/Open Distributed Transaction Processing Reference Model),是X/Open这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由各个厂商进行具体的实现。
X/Open DTP 定义了三个组件:AP、RM、TM,两个协议:XA、TX
AP(Application Program):也就是应用程序,可以理解为使用DTP的程序
RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。
TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器。
XA协议:应用或应用服务器与事务管理之前通信的接口
TX协议:全局事务管理器与资源管理器之间通信的接口
事务管理器(TM)控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源。
这里还要提到一个点,就是2PC(两阶段提交),在全局事务中,为了保证所有的操作可以一次性要么全提交,要么全失败。事务管理器和资源管理器之间的事务操作的控制是采用2PC来进行的。2PC本身是存在同步阻塞问题,这就会导致效率变低,所以,采用2PC进行事务控制的全局事务也必然存在效率低的问题。这也是全局事务最致命的缺点,在提倡微服务的今天,这是不能容忍的。
J2EE中全局事务的实现
Java自身提供了一些API可以用来实现全局事务,JTA事务就是用来实现J2EE中的全局事务。
JTA
JTA(Java Transaction API):面向应用、应用服务器与资源管理器的高层事务接口。
JTS(Java Transaction Service):JTA事务管理器的实现标 准,向上支持JTA,向下通过CORBA OTS实现跨事务域的互操作性。
EJB:基于组件的应用编程模型,通过声明式事务管理进一步 简化事务应用的编程。
全局事务的优缺点
优:全局事务,作为一种标准的分布式事务解决方案,他解决了本地事务无法满足分布式场景中数据的ACID的要求。
缺:2PC,同步阻塞,同时占用多个资源导致效率低。
总结
本文主要介绍了本地事务和全局事务,本地事务很简单,在Java中可以使用JDBC来实现本地事务,全局事务是一种基本的分布式事务解决方案,是符合DTP模型的事务管理机制。
目前,越来越多的web开发要涉及到分布式事务,尤其是微服务架构最近越来越火,在微服务架构中,分布式事务是必然存在的。对于分布式事务的处理,本文主要介绍了一个典型的方案:全局事务。但是实际上,低效率的全局事务并不是很适合用来解决大型网站的分布式事务问题。在业内,主要用来解决分布式事务的方案是使用柔性事务。柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型。
(番外篇)事务涉及的对象:
1,资源:应用程序存储和获取数据的地方,可以是数据库,文件,也可以是内存。如果是应用程序的事务块代码中涉及到的数据库,文件,内存,那这些资源就称为事务型资源。
2,资源管理器:在事务模型中,应用不是直接访问资源,而是通过中间介访问资源,这个中间介就叫资源管理器。资源分为可持久化资源(对应了持久化资源管理),易失资源(对应了易失资源管理器)。
3,事务管理器:实现事务的开始,提交,回滚。