3-JTA分布式事务

Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版 的应用程序接口,
JTA和它的同胞Java事务服务(JTS;Java TransactionService),为J2EE平台提供了分布式事务服务。不过JTA只是提供了一个接口,并没有提供具体的实现,而是由j2ee服务器提供商 根据JTS规范提供的,常见的JTA实现有以下几种:
(1) J2EE容器所提供的JTA实现(JBoss)。
(2) 独立的JTA实现:如JOTM,Atomikos.这些实现可以应用在那些不使用J2EE应用服务器的环境里用以提供分布事事务保证。如Tomcat,Jetty以及普通的java应用。
关于分布式事务、两阶段提交协议、三阶提交协议
Java中的事务——JDBC事务和JTA事务

JTA实现分布式事务原理

  • 参考文章:JTA 深度历险 - 原理与实现

  • 要理解 JTA 的实现原理首先需要了解其架构:它包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager ) 两部分, 我们可以将资源管理器看做任意类型的持久化数据存储事务管理器则承担着所有事务参与单元的协调与控制

  • 根据所面向对象的不同,可以将 JTA 的事务管理器和资源管理器理解为两个方面:

    • 面向开发人员的使用接口(事务管理器)
    • 面向服务提供商的实现接口(资源管理器)。
    • 其中开发接口的主要部分即为 UserTransaction 对象,开发人员通过此接口在信息系统中实现分布式事务;而实现接口则用来规范提供商(如数据库连接提供商)所提供的事务服务,它约定了事务的资源管理功能,使得 JTA 可以在异构事务资源之间执行协同沟通。以数据库为例,IBM 公司提供了实现分布式事务的数据库驱动程序,Oracle 也提供了实现分布式事务的数据库驱动程序, 在同时使用 DB2 和 Oracle 两种数据库连接时, JTA 即可以根据约定的接口协调者两种事务资源从而实现分布式事务。正是基于统一规范的不同实现使得 JTA 可以协调与控制不同数据库或者 JMS 厂商的事务资源
      JTA体系架构图
  • JTA最重要的是三个接口:

    1. UserTransaction: 面向开发人员,开发人员通常使用该接口,实现应用程序对JTA全局事务的支持。
    2. TransactionManager : 事务管理器,将应用程序对分布式事务的使用映射到实际的事务资源并在事务资源间进行协调与控制,所以该事务管理器在使用的时候需要单例
    3. Transaction: 代表了一个物理意义上的事务,实现真正的事务提交,回滚等操作,Transactiion.commit() 二阶段提交举例:
      public void commit() {
             // 得到当前事务中的所有事务资源
                List<XAResource> list = getAllEnlistedResouces();
             // 第一准备阶段:通知所有的事务资源管理器,准备提交事务
             for(XAResource xa : list){
                 xa.prepare();
             }
             //第二提交阶段:所有事务性资源,提交事务
             for(XAResource xa : list){
                 xa.commit();
             }
       }
      
JTA 实现类图
  • 各接口之间调用流程:
    (1)在开发人员调用 UserTransaction.begin() 方法时 TransactionManager会创建一个 Transaction 事务对象(标志着事务的开始)并把此对象通过 ThreadLocale 关联到当前线程。
    (2)UserTransaction 接口中的 commit()rollback()等方法都将最终通过TransactionManager的得到与当前线程相关的Transaction对象,委托给Transaction 类的对应方法执行采用两阶段提交实现分布式事务.
    UserTransaction.commit(){
    Transation tx = (Transation)TransactionManager.get();
    tx.commit();
    }

事务资源是如何以透明的方式加入到 JTA 事务中的?

  • 最最重要的一点是:在 JTA 事务 代码中获得的数据库源 ( DataSource ) 必须是支持分布式事务的;
  • 支持事务的数据源与普通的数据源是不同的,实现了额外的 XADataSource 接口。
  • 我们可以简单的将 XADataSource 理解为普通的数据源(继承了 java.sql.PooledConnection),只是它为支持分布式事务而增加了 getXAResource 方法。另外,由 XADataSource 返回的数据库连接与普通连接也是不同的,此连接除了实现 java.sql.Connection 定义的所有功能之外还实现了 XAConnection 接口。我们可以把 XAConnection 理解为普通的数据库连接,它支持所有 JDBC 规范的数据库操作,不同之处在于 XAConnection 增加了对分布式事务的支持。通过下面的类图读者可以对这几个接口的关系有所了解:
    事务资源类图

JBoss

  • 由第三方服务器JBoss等实现分布式事务管理UserTransactionTransationManager等。
  • 在应用程序中使用 userTx = (UserTransaction)getContext().lookup("java:comp/UserTransaction");方式获得 Transaction 管理对象,也成为JNDI的方式;
  • 我们目前基本不用。

Atomikos

  • 我们目前比较主流的使用Atomikos公司旗下的事务管理器来管理分布式事务。
  • 其中该公司旗下免费的: TransactionEssentials 事务管理器为我们所用;
  • 点击查看另外一篇文章对Atomikos有详细的说明;

Atomikos独自时间分布式事务和spring+mybatis+druid+automikos实现分布式

spring boot mybatis实现分布式事务;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249