最近在项目中遇到一个有关XA事务问题。对于何为XA事务我也说不太清楚,我现在的理解是一个需要横跨多个数据库甚至多类型数据库的操作。这个问题费尽周折终告解决,对于该问题的全程解决网上并没有整理完全的东西,高兴之余整理出来与大家共享。
问题描述:某操作需要更新多个表,而这些表又分别分散在SQL SERVER和DB2的多个库当中(相关技术实现java、websphere)。使用SLSB(无状态Session Bean)做该项操作事务处理。结果执行过程中,所有SQL均可成功执行,但操作无法通过。报错信息为在执行SQL SERVER的SQL时(在全局事务中发生非法尝试使用多个仅有一阶段能力的资源,方法 enlist 捕捉到 com.ibm.ws.Transaction.IllegalResourceIn2PCTransactionException,当尝试使用事务管理器为当前事务从数据源 XXX 将资源加入列表时(具体错误略)),然后在整个事务提交时报错(处理方法 allocateMCWrapper 时应该存在活动的事务,处理方法 initializeForUOW 时应该存在活动的事务。com.ibm.ws.Transaction.IllegalResourceIn2PCTransactionException,org.omg.CORBA.TRANSACTION_ROLLEDBACK: javax.transaction.TransactionRolledbackException)。表现结果为SQL SERVER的对应SQL成功执行并提交,DB2的SQL成功执行但未提交。
处理过程详细说明:
在WEBSPHERE管理台将DB2数据源建为XA类型数据源,并成功测试连接。但在将SQLSERVER数据源建为XA数据源时报错(未能找到存储过程 'master..xp_jdbc_open2'),无奈SQLSERVER仍用普通数据源。运行结果所有SQL均成功执行但全部无法提交,报错内容(发生试探非法用现有两阶可用资源提交一阶可用资源,org.omg.CORBA.TRANSACTION_ROLLEDBACK: javax.transaction.TransactionRolledbackException)。
解决如何添加SQLSERVER(XA)类型数据源。从网上下载SQLSERVER支持XA驱动,可从ftp://ftp.software.ibm.com/software/websphere/info/tools/DataDirect/datadirect.htm 查看说明并下载,根据说明与本机器配置将适合的sqljdbc.dll文件放入SQL SERVER安装目录的BINN目录下,并对master库执行包中SQL脚本instjdbc.sql。成功执行后启动本机“Distributed Transaction Coordinator”服务,如无法成功启动,在运行中执行命令“msdtc -resetlog”再尝试启动。然后尝试添加SQLSERVER(XA)类型数据源,结果无法连接,报错(xa_open (0) returns -3DSRA0010E: SQL 状态 = HY000,错误代码 = 20,001)。此时应检查注册表中分支HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security中XATransactions的键值,应改为1(非0值)用以设置XA事务可用。设置完成后重启DTC服务、SQL SERVER以及WEBSPHERE使设置完全生效。然后测试可正常连接。
做过上述设置后,程序在WEBSPHERE中可完全支持横跨DB2、SQL SERVER多个数据库之间的全局事务。
祝以后遇到这个问题的所有人好运!
分享到:
相关推荐
当多个MQ队列参与同一个事务时,就需要使用到XA事务。在这种情况下,事务协调器(通常是MQ本身)负责协调所有参与队列,确保它们要么全部完成,要么全部回滚。这使得跨多个队列的操作具有原子性,是保证数据一致性的...
分布式事务处理是解决多数据库系统中一致性问题的关键技术,而X/Open Distributed Transaction Processing (DTP)模型和XA规范是这一领域的重要理论基础和实现标准。X/Open组织,现称为Open Group,于1994年提出了DTP...
XA是一个由X/Open组织定义的标准,它定义了事务管理器和资源管理器之间通信的接口。MySQL从5.1版本开始支持XA接口,从而能够参与到分布式事务处理中。 #### 六、MySQL XA MySQL服务器作为资源管理器,在分布式事务...
以下是一个使用 XA 事务的示例,展示如何在两个 MySQL 实例中协调事务: ##### 5.1 开始和结束事务 ```sql -- 在实例 1 中 XA START 'global-transaction-1'; UPDATE accounts SET balance = balance - 100 WHERE ...
如果 Saga事务中的任何一个小事务失败,整个Saga事务都会回滚。Saga事务可以确保分布式事务的一致性和可靠性,但是它的实现复杂度较高。 TCC(Try-Confirm-Cancel)是指分布式事务处理的补偿事务模型。TCC事务由三...
xid_cache是一个内存表,用于暂存处于预备状态的外部XA事务的事务ID(xid)。在崩溃恢复过程中,MySQL的存储引擎需要检查处于XA_PREPARED状态的事务,并将这些事务ID收集起来。内部XA事务的处理依赖于binlog中的记录...
Atomikos是Java平台上的一个强健的事务管理解决方案,它支持JTA(Java Transaction API)标准,可以处理复杂的分布式事务场景。 首先,我们需要理解什么是XA事务。XA事务是一种两阶段提交(2PC)协议,用于协调跨多...
在JDBC中,默认情况下,每个SQL语句都是一个独立的事务,为了将多个SQL语句组合成一个事务,需要将auto-commit模式屏蔽掉。这样,多个SQL语句可以被组合成一个事务,并且可以使用commit()方法来确认事务。 使用JDBC...
- `XA {START|BEGIN} xid [JOIN|RESUME]`:用于启动一个具有指定xid值的分布式事务。`xid`由三部分组成:全局事务标识符`gtrid`、分支限定符`bqual`以及格式标识`formatId`。 - `XA END xid [SUSPEND [FOR MIGRATE]]...
使用Atomikos支持分布式事务,Spring+Mybatis+Druid+AtomikosDataSource 使用手册: https://www.yuque.com/itman/wosfkn/mreame
MDB是Java EE容器中的一个特殊类型的EJB(Enterprise JavaBean),它专门用于处理来自JMS队列或主题的消息。MDB的主要优点在于其异步处理能力,可以解耦发送和接收消息的组件,提高系统的响应性和可扩展性。在JMS中...
因此,对于一个生产环境的MySQL服务器,确保所有事务在系统关闭时都得到了适当的清理是非常重要的,以避免启动时的恢复过程和潜在的数据不一致性问题。 总之,MySQL的XA事务恢复过程是一个复杂的过程,涉及到对...
在AT模式下,库存服务和订单服务都会在本地开启一个事务,然后向Seata服务器注册这个全局事务。 在`seata-order`的代码中,首先会调用库存服务的接口尝试扣减库存,如果成功,则继续创建订单。这个过程中,Seata会...
TDDL加入XA两阶段事务提交,本人自己跟代码画的这些图,从原公司离职没有保存代码,希望这个图可以给研究TDDL的朋友一些启发
3. **隔离性(Isolation)**:并发执行的事务之间不会互相干扰,即一个事务内部的操作对其他并发事务来说是隔离的。 4. **持久性(Durability)**:一旦事务完成,它对数据库所做的更改就是永久性的。 **CAP理论**...
当应用程序需要同时操作多个数据库或其他资源时(例如消息队列、文件系统等),并且要求这些操作作为一个整体成功或失败时,就需要使用XA驱动来确保事务的一致性。 ##### 2. 技术实现与应用场景 - **技术实现**: ...
1. 分布式事务处理模型:XA规范定义了一个分布式事务处理模型(X/Open DTP Model),它将事务处理过程中的不同组件之间的接口进行了标准化。该模型包括了应用程序、事务管理器、资源管理器和通信资源管理器。 2. ...
在PHP中,我们可以创建多个数据库连接对象,每个连接对应一个数据库,然后使用相同的XID(全局事务标识符)来标识这些操作属于同一个事务。以下是一个示例: 1. 创建数据库连接,如`$dbtest1`和`$dbtest2`分别连接...