示例 代码 Java JTA XA transaction 分布式事务

Java事务--JTA原理 上一篇文章介绍了JDBC事务,JDBC可以处理单数据源的事务,满足大部分事务处理的需求,但是JDBC事务不能解决多数据源和分布式事务问题,Java平台给我们提供了解决方案--JTA。本文将探讨JTA的一些细节。 阅读详情

关于XID的实现有个需要注意的细节,如果要保证数据的事务一致性,除了全局事务ID一致外,还必需保证formatid一致,这个formatid一般是不会变的,但不同的厂商一般是不一样的,在xid传播过程中,应该保证使用一样的formatid才可以。

下面的代码,包含了 JTA XA的几乎全部的 API和注意事项,帮助搭建分布式事务平台,以及解惑多进程间事务协调问题:

 

package xa;

import oracle.jdbc.xa.client.OracleXADataSource;

import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class XATest {
    public static XADataSource createXADataSource() throws Exception {
        OracleXADataSource dataSource = new OracleXADataSource();
        dataSource.setURL("jdbc:oracle:thin:@168.1.55.111:1521:orcl");
        dataSource.setUser("user");
        dataSource.setPassword("pass");
        return dataSource;
    }

    public static void insertWithConn(Connection conn, String name) throws Exception {
        String sql = "INSERT INTO TEST_EJB VALUES('" + name + "')";
        Connection connection = null;
        Statement statement = null;
        try {
            connection = conn;
            statement = connection.createStatement();
            statement.executeUpdate(sql);
        } finally {
            if (statement != null) statement.close();
            if (connection != null) connection.close();// should be returned to the xa ds pool
        }
    }

    public static void queryWithConn(Connection conn) throws SQLException {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = conn;
            statement = connection.createStatement();
            resultSet = statement.executeQuery("SELECT count(1) FROM TEST_EJB");
            while (resultSet.next()) {
                System.out.println("query: " + resultSet.getString(1));
            }
        } finally {
            if (resultSet != null) resultSet.close();
            if (statement != null) statement.close();
            if (connection != null) connection.close();// should be returned to the xa ds pool
        }
    }

    static class MyXid implements Xid {
        int formatId;
        byte[] globalTransactionId;
        byte[] branchQualifier;

        public MyXid(int formatId, byte[] globalTransactionId, byte[] branchQualifier) {
            this.formatId = formatId;
            this.globalTransactionId = globalTransactionId;
            this.branchQualifier = branchQualifier;
        }

        public int getFormatId() {
            return formatId;
        }

        public byte[] getGlobalTransactionId() {
            return globalTransactionId;
        }

        public byte[] getBranchQualifier() {
            return branchQualifier;
        }
    }

    public static void main(String[] args) throws Exception {
//        1.
//        suspend();
//        resume();
//        2.
//        reUseXaRes();
//        3.
//        reUseXaRes2();
//        4.
//        join();
//        5.
//        recover();
//        6.
//        mutiProcess(1);
        mutiProcess(2);
    }

    public static void mutiProcess(int flag) throws Exception {
        int len = 4;
        XAConnection[] xaCons = new XAConnection[len];
        for (int i = 0; i < len; i++) {
            xaCons[i] = createXADataSource().getXAConnection();
        }
        MyXid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x04});

        if (flag == 1) {
            XAResource xaResource = xaCons[0].getXAResource();
            xaResource.start(xid1, XAResource.TMNOFLAGS);// 全局id一样,新的分支id的,则使用 TMNOFLAGS
//            xaResource.start(xid1, XAResource.TMJOIN);// 全局id和分支id都一样,则使用 TMJOIN
            xaCons[0].getConnection().createStatement().executeUpdate("INSERT INTO TEST_EJB VALUES('11')");
            xaResource.end(xid1, XAResource.TMSUCCESS);
        } else {
            XAResource xaResource = xaCons[1].getXAResource();
//            xaResource.start(xid1, XAResource.TMNOFLAGS);// 全局id一样,新的分支id的,则使用 TMNOFLAGS
            xaResource.start(xid1, XAResource.TMJOIN);// 全局id和分支id都一样,则使用 TMJOIN
            ResultSet resultSet = xaCons[1].getConnection().createStatement().executeQuery("select * from TEST_EJB");
            while (resultSet.next()) {
                String string = resultSet.getString(1);
                System.out.println(string);
            }
            xaResource.end(xid1, XAResource.TMSUCCESS);
        }

//        int ret = xaCons[2].getXAResource().prepare(xid1);
//        if (ret == XAResource.XA_OK) {
//            xaCons[3].getXAResource().commit(xid1, false);
//        }

    }

    public static void recover() throws Exception {
        XADataSource xaDS;
        XAConnection xaCon;
        XAResource xaRes;
        xaDS = createXADataSource();
        xaCon = xaDS.getXAConnection();
        xaRes = xaCon.getXAResource();

        Xid[] xids = xaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN);
        System.out.println("共扫描到可恢复个数:" + xids.length);
        for (Xid id : xids) {
            if (id.getFormatId() == 100) {
                System.out.println("待恢复事务格式:" + id.getFormatId());
                try {
                    // 可通过注释掉 前面业务的 commit/rollback方法,然后通过恢复的方式进行 commit
                    xaRes.rollback(id);//对于其他没有调用 commit/rollback的可以在这里调用
//                    xaRes.commit(id, false);//对于其他没有调用 commit/rollback的可以在这里调用
                } catch (Exception e) {
                    xaRes.forget(id);
                }
            } else {
//                System.out.println("无需恢复格式:" + id.getFormatId());
            }
        }
    }

    /**
     * 本测试的结论是 start-业务sql-end 必需使用相同的连接, prepa,commit,rollback可以使用不同的连接
     * 连接 start之后必需自己进行end,其它进程不可,如果本连接直接调用close会丢失事务,而end则会保留事务
     */
    public static void join() throws Exception {
        int len = 2;
        XAConnection[] xaCons = new XAConnection[len];
        for (int i = 0; i < len; i++) {
            xaCons[i] = createXADataSource().getXAConnection();
        }
        MyXid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

        // 连接1
        XAResource xaResource0 = xaCons[0].getXAResource();
        xaResource0.start(xid1, XAResource.TMNOFLAGS);
        xaCons[0].getConnection().createStatement().executeUpdate("INSERT INTO TEST_EJB VALUES('00')");
        xaResource0.end(xid1, XAResource.TMSUCCESS);

        // 连接2
        XAResource xaResource1 = xaCons[1].getXAResource();
        if (!xaResource1.isSameRM(xaResource0)) {
            xaResource1.start(xid1, XAResource.TMJOIN);// join
            xaCons[1].getConnection().createStatement().executeUpdate("INSERT INTO TEST_EJB VALUES('10')");
            xaResource1.end(xid1, XAResource.TMSUCCESS);
        } else {
            MyXid xid2 = new MyXid(100, new byte[]{0x01}, new byte[]{0x03});
            xaResource1.start(xid2, XAResource.TMNOFLAGS);
            xaCons[1].getConnection().createStatement().executeUpdate("INSERT INTO TEST_EJB VALUES('20')");
            xaResource1.end(xid2, XAResource.TMSUCCESS);
            int ret = xaResource1.prepare(xid2);
            if (ret == XAResource.XA_OK) {
                xaResource1.commit(xid2, false);
            } else if (ret == XAResource.XA_RDONLY) {
                System.out.println("此分支的全局事务id和上面一样,所以不用单独提交!!!");
            }
        }
        int ret = xaResource0.prepare(xid1);
        if (ret == XAResource.XA_OK) {
            xaResource0.commit(xid1, false);
        }
    }

    /**
     * 本测试的结论是 start-业务sql-end 必需使用相同的连接, prepa,commit,rollback可以使用不同的连接
     * 连接 start之后必需自己进行end,其它进程不可,如果本连接直接调用close会丢失事务,而end则会保留事务
     */
    public static void reUseXaRes2() throws Exception {
        int len = 5;
        XAConnection[] xaCons = new XAConnection[len];
        for (int i = 0; i < len; i++) {
            xaCons[i] = createXADataSource().getXAConnection();
        }
        MyXid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

        // 0 .start
        xaCons[0].getXAResource().start(xid1, XAResource.TMNOFLAGS);
        Statement stmt = xaCons[0].getConnection().createStatement();
        stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('1')");
        xaCons[0].getXAResource().end(xid1, XAResource.TMSUCCESS);

        int ret = xaCons[3].getXAResource().prepare(xid1);
        if (ret == XAResource.XA_OK) {
            xaCons[4].getXAResource().commit(xid1, false);
        }

        for (int i = 0; i < len; i++) {
            xaCons[i].close();
        }
    }

    public static void reUseXaRes() throws Exception {
        XADataSource xaDS;
        XAConnection xaCon;
        XAResource xaRes;
        Xid xid;
        Connection con;
        Statement stmt;
        int ret;
        xaDS = createXADataSource();
        xaCon = xaDS.getXAConnection();
        xaRes = xaCon.getXAResource();
        con = xaCon.getConnection();
        stmt = con.createStatement();

        MyXid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
        MyXid xid2 = new MyXid(100, new byte[]{0x11}, new byte[]{0x22});
        xaRes.start(xid1, XAResource.TMNOFLAGS);
        stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('1')");
        xaRes.end(xid1, XAResource.TMSUCCESS);

        xaRes.start(xid2, XAResource.TMNOFLAGS);
        ret = xaRes.prepare(xid1);
        if (ret == XAResource.XA_OK) {
            xaRes.commit(xid1, false);
        }

        stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('2')");
        xaRes.end(xid2, XAResource.TMSUCCESS);
        ret = xaRes.prepare(xid2);
        if (ret == XAResource.XA_OK) {
            xaRes.rollback(xid2);
        }
    }

    public static void suspend() throws Exception {
        XADataSource xaDS;
        XAConnection xaCon;
        XAResource xaRes;
        Xid xid;
        Connection con;
        Statement stmt;
        int ret;
        xaDS = createXADataSource();
        xaCon = xaDS.getXAConnection();
        xaRes = xaCon.getXAResource();

        // oracle 查询是否有锁语句:SELECT * FROM v$locked_object;
        System.out.println("默认超时时间:" + xaRes.getTransactionTimeout() + " 秒");
        xaRes.setTransactionTimeout(30);//10秒,在超时之前不提交或回滚,数据库会有行锁,锁住业务操作的数据行,此时不能进行truncate等影响该行锁操作

        System.out.println("设置超时时间:" + xaRes.getTransactionTimeout() + " 秒");
        con = xaCon.getConnection();
        stmt = con.createStatement();
        xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
        try {
            System.out.println("start 之前 AutoCommit:" + con.getAutoCommit());
            xaRes.start(xid, XAResource.TMNOFLAGS);// 当上一个 xid 没有commit或rollback时,不能start相同的
            System.out.println("start 之后 AutoCommit:" + con.getAutoCommit());

            stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('事务内部,受到事务控制')");//受到 commit/rollback控制
            //xaRes.end(xid, XAResource.TMSUCCESS);//表示要结束,不能再开启
            xaRes.end(xid, XAResource.TMSUSPEND);//表示暂时挂起,可以再开启
            System.out.println("  end(标记挂起) 之后 AutoCommit:" + con.getAutoCommit());

            stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('事务外部,不受事务控制')");//在end之后,不会受到 commit/rollback控制

//            xaRes.start(xid, XAResource.TMRESUME);//重新开启之前挂起的事务,注意如果当前连接已经建立了则不能进行,需要一个新的 xa 连接来进行
        } finally {
            stmt.close();
            con.close();
            xaCon.close();
        }
    }

    public static void resume() throws Exception {
        XADataSource xaDS;
        XAConnection xaCon;
        XAResource xaRes;
        Xid xid;
        Connection con;
        Statement stmt;
        int ret;
        xaDS = createXADataSource();
        xaCon = xaDS.getXAConnection();
        xaRes = xaCon.getXAResource();
        con = xaCon.getConnection();
        stmt = con.createStatement();
        xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
        try {

            xaRes.start(xid, XAResource.TMRESUME);//重新开启之前挂起的事务,注意如果当前连接已经建立了则不能进行
            System.out.println("resume 之后 AutoCommit:" + con.getAutoCommit());

            stmt.executeUpdate("INSERT INTO TEST_EJB VALUES('重新开启事务内部,再次受到事务控制')");//受到 commit/rollback控制
            xaRes.end(xid, XAResource.TMSUCCESS);//表示要结束,不能再开启
            System.out.println("  end(标记成功) 之后 AutoCommit:" + con.getAutoCommit());

//            xaRes.start(xid, XAResource.TMRESUME);//重新开启之前挂起的事务

            ret = xaRes.prepare(xid);
            if (ret == XAResource.XA_OK) {
                System.out.println("prepare 结果为 XA_OK,可以提交或回滚");
                xaRes.commit(xid, false);
//                xaRes.rollback(xid);
            } else if (ret == XAResource.XA_RDONLY) {//没有执行 insert/update等语句,只是select则不用提交
                System.out.println("prepare 结果为 XA_RDONLY,表示无事务,无需也不能进行后续commit/rollback");
                // xaRes.commit(xid, false); // XA_RDONLY,不能进行提交或回滚,此时事务不存在
            }
        } finally {
            stmt.close();
            con.close();
            xaCon.close();
        }
    }
}


ABB机器人C#二次开发实战:从通信打通到数据读写的落地指南(附完整工程) 最近在做自动化产线升级项目时,遇到一个核心需求:用C#上位机实时读取ABB机器人的关节角度、IO信号,同时下发运动指令和参数配置。翻遍全网,要么是Robot Studio的基础操作教程,要么是C++/VC++的老旧案例,C#相关的实操内容要么只给片段代码,要么跳过通信配置、权限设置等关键步骤,导致刚上手时踩了无数坑——连接超时、数据读不到、写入无响应,甚至误触发机器人安全保护。 阅读详情

相关推荐

【机器人开发】四足机械狗(并联结构)URDF建模与Simscape仿真全流程解析

本文详细解析了四足机械狗(并联结构)从URDF建模到Simscape仿真的全流程开发。内容涵盖SolidWorks建模要点、URDF文件导出与优化、Matlab/Simscape环境搭建,以及并联机构特有的运动控制和步态规划实现,为机器人开发者提供了一套完整的解决方案。

weixin_30642561的博客 528

Oracle XA例子

/*    A simple 2 phase XA demo. Both the branches talk to different RMS    Need 2 java enabled 8.1.6 databases to run this demo.      -> start-1      -> start-2      -> Do some DML on 1      -> Do som

wonder的地下室 5875

Windows下用Anaconda安装d2l库避坑指南(附PermissionError解决方案)

本文详细介绍了在Windows系统下使用Anaconda安装d2l库的完整指南,特别针对常见的PermissionError问题提供了多种解决方案。从环境准备到库安装,再到VSCode配置和数据路径处理,帮助读者顺利搭建深度学习环境并运行《动手学深度学习》的代码示例。

3a9bq4r8t2y的博客 224

java 分布式事务的实现方式之XA协议

需要注意的是,XA协议的实现需要协调器和参与者遵循特定的接口和协议。在Java中,可以使用JTA(Java Transaction API)来实现XA协议。JTA提供了TransactionManager和UserTransaction等接口来管理和控制分布式事务。在使用JTA实现XA协议时,参与者需要实现XAResource接口,该接口定义了参与者与事务管理器之间的交互方法,包括准备(prepare)、提交(commit)、回滚(rollback)等。

yuanchengfu0910的博客 1616

ROS2 Control实战:多机器人仿真与控制器管理

本文详细介绍了ROS2 Control在多机器人仿真中的应用,涵盖命名空间配置、控制器管理及性能优化。通过Gazebo仿真环境和ROS2 Control框架,开发者可以高效管理多个机器人的硬件抽象和控制器,实现资源隔离与平滑切换。文章还提供了常见问题排查和调试工具推荐,助力机器人开发实践。

u9v0w的博客 203

100kHz手持LCR表设计:高频阻抗测量与校准实战解析

阻抗测量是电子元件测试的基础,LCR表通过施加正弦激励并分析电压电流的幅值与相位,即可获取电容、电感、电阻的等效参数。在开关电源、无线充电等高频应用场景中,元件在100kHz下的ESR和阻抗特性尤为关键,传统10kHz手持仪表难以满足需求。本文从自动平衡桥原理出发,探讨如何将台式电桥的核心能力浓缩至手持设备,重点剖析高频寄生参数抑制、模拟链路设计、数字相敏检波算法及开路短路校准方法。通过实测数据验证,在100kHz频率下基本精度可达0.5%以内,为维修现场、产线抽检及硬件调试提供了可携带的精密测量方案。全文

weixin_33910191的博客 396

TransactionTimeout(事务超时)

Transaction timeout (unit is always seconds) can be configured in various ways:This argument is the same no matter if you are using JBossTM(=4.2).Globally: You can change this behavior globally by modifying the TransactionManagerService in /conf/jboss-

风雨亭 9529

Apache Hop环境搭建实战:从零到一的下载、安装与配置指南

本文详细介绍了Apache Hop环境搭建的全过程,包括下载、安装与配置指南。从选择正确的JDK17版本到设置关键环境变量,再到启动GUI界面和解决常见问题,提供了全面的实战指导。适合数据工程师和ETL开发者快速上手这一强大的数据集成工具。

weixin_42634811的博客 573

java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...

在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子。请通过以下方式下载github源代码:本地事务和分布式事务的区别在于:本地事务只用于处理单一数据源事务(比如单个数据库),分布式事务可以处理多种异构的数据源,比如某个业务操作中同时包含了JDBC和JMS或者某个操作需要访问多个不同的数据库。Java通过JTA完成分布式事务,JTA本身只是一种规范,不同...

weixin_35143292的博客 422

〔重庆理工大学〕计算机网络实验指导书【实验九 直连路由,静态路由,默认路由配置】

本实验指导书介绍了直连路由、静态路由和默认路由的配置方法。主要内容包括:1)路由器基础知识,包括直连路由、静态路由和动态路由三种路由生成方式;2)路由度量值与匹配顺序,解释了不同路由类型的优先级;3)实验任务分为三个部分:直连路由的查看分析、静态路由的配置以及默认路由的配置,详细说明了配置步骤和命令。实验要求通过模拟器搭建网络环境,完成路由配置使PC间能够互通。实验旨在帮助学生掌握不同路由类型的工作原理和配置方法,适用于简单的网络环境。

Pretty Boy Fox的博客 1056

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点)

Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地

走向CTO的路上... 1332

com.atomikos.datasource.ResourceException: XA resource ‘hrDataSource‘: resume for XID ‘3132372E302E3

昨天在我们公司的日志里发现报错,可能大家出错原因不一样,但我的是因为代码最后事物处理时候产生了锁导致的。 2018-08-07 08:49:52.020 [http-nio-9999-exec-3] ERROR o.a.e.i.interceptor.CommandContext - Error while closing command context com.atomikos.datasou...

weixin_42441435的博客 5517

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jta mysql_JTA 使用 MySQL 分布式事务

public classJTA_MySQL {public static voidmain(String[] args) {XADataSource xaDs1=JTA_MySQL.getDataSource("jdbc:mysql://172.30.60.126:3306/db_zhang", "root","root");XAConnection xaCon1= null;XAResource...

weixin_39634480的博客 143

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

传统Spring配置JTA 实现多数据源事务的统一管理

分布式事务是指事务的参与者、支持事务的服务器、资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算机资源上访问并且更新数据,将两个或多个网络计算机的数据进行的多次操作作为一个整体进行处理。如不同银行账户之间的转账。 对于在项目中接触到JTA,大部分的原因是因为在项目中需要操作多个数据库,同时,可以保证操作的原子性,保证对多个数据库的操作一致性...

weixin_30553837的博客 168

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java的分布式事务(JTA和XA)

关于JTA事务和XA事务的介绍 何为分布式事务 一个事务包含多个操作,多个操作操作了多个数据源,这样的事务称为分布式事务。 案例 为什么不能简单的借助数据源的本地事务 用数据源本地事务代码案例 Con1 = db1.getConn..; Con2 = db2.getConn..; Try{ con1.insert…. con2.update…. con1.commit; con2.commit;...

K-Darker的专栏 9737

Java 分布式事务规范 JTA 从入门到精通

最近回顾 Spring 事务相关的设计与实现,发现 Spring 事务设计的最初目的是为了统一 Java 中 JDBC、JTA 与 JPA 事务的使用方式,并且其实现参考了 JTA 规范。 网上 JTA 的相关文章,要么参照规范照本宣科的把原理简单介绍,要么就直接上 Spring Boot 整合 JTA 框架的代码,由于知识跨度比较大,增加了对 JTA 理解的难度。经过几天的不懈努力,查阅相关资料,我也对 JTA 有了一定的理解,这里将知识结构以循序渐进的方式进行介绍,也避免小伙伴们多走弯路。...

大鹏的博客 1万+

Java事务 API——JTA事务(学习分享)

文章目录JTA事务介绍什么是JTA事务什么是XA规范常见的JTA实现JTA的架构UserTransaction接口(面向开发人员的接口)Transaction 接口(面向提供商的接口)TransactionManager接口(面向提供商的接口)实例JTA事务处理过程本地事务处理实例JTA事务处理实例(分布式事务处理)补充JTA事务和JDBC事务的区别 JTA事务 介绍 什么是JTA事务 JTA:(Java Transaction API)Java事务API。是一个Java企业版的应用程序接口,在Java程

weixin_43839323的博客 3639

spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA

在介绍这两个概念之前,我们先看看是什么是X/Open DTP模型。X/Open X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行业技术标准。X/Open组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循X/Open组织定义的行业技术标准,也参与到标准的制定。官网地址:http://www.opengroup.org/X/Open DTP 全称 X/Open D...

weixin_39716160的博客 215

分布式事务概念深度指津:JTA XA 深度 历险 - 原理与实现

原文链接:JTA XA 深度 历险 - 原理与实现---- https://www.ibm.com/developerworks/cn/java/j-lo-jta/利用 JTA 处理事务什么是事务处理事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilil...

ice-wee的专栏 1287

JTA Transaction

原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-jta/ 利用 JTA 处理事务 什么是事务处理 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最

TangXW的博客 847

19、企业级服务-JTA事务管理

详细讲解Javaee企业级服务之JTA事务管理

qq_22910257的博客 868

Ehcache3事务管理深度解析:JTA与XA事务集成指南

在分布式系统中,确保数据一致性是开发者面临的重要挑战。Ehcache3作为一款高性能的Java缓存框架,通过与JTA(Java Transaction API)和XA事务协议的深度集成,为分布式事务管理提供了可靠解决方案。本文将全面介绍Ehcache3的事务管理机制,帮助开发者快速掌握JTA与XA事务的配置方法及最佳实践。 ## 一、Ehcache3事务管理核心概念 ### 1.1 什么是JT

gitblog_01073的博客 720

SpringBoot整合JTA

导读JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据...

码猿技术专栏 3208

分布式事务解决方案:XA规范

XA规范 二阶段提交协议是一个协议,而XA规范是X/Open 组织针对二阶段提交协议的实现做的规范。目前几乎所有的主流数据库都对XA规范提供了支持。 这样做的好处是方便多个资源(如数据库,应用服务器,消息队列等)在同一个事务中访问。你可以类比JDBC 我们这篇文章就以MySQL XA为例演示一下XA怎么玩? MySQL XA常用的命令如下 命令 解释 XA START xid 开启一个事务,并将事务置于ACTIVE状态,此后执行的SQL语句都将置于该事务中 XA END xid 将事务.

小识的博客 2037

Java事务三种类型:JDBC事务、JTA(Java Transaction API)事务、容器事务

一、什么是Java事务   通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。   事务必须服从ISO/IEC所制定的ACID原则。 原子性(atomicity)一致性(consistency)隔离性(isolation)

qq_38724991的博客 4581
上一篇: linux中shell变量$#,$@,$0,$1,$2的含义解释
下一篇: Java 多线程 并发 锁 Java线程面试题 Top 50
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值