一个XA事务问题解决小结

一个XA事务问题解决小结

最近在项目中遇到一个有关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多个数据库之间的全局事务。

祝以后遇到这个问题的所有人好运!


问题背景:
         公司在配置信新的开发服务器时,xa事务始终无法使用。
         服务器环境:windows server 2003 sp2 ;
         数据库SQL Server Management Studio      9.00.1399.00
                        Microsoft Analysis Services 客户端工具      2005.090.1399.00
                        Microsoft 数据访问组件 (MDAC)      2000.085.1132.00 (xpsp.080413-0852)
                        Microsoft MSXML      2.6 3.0 5.0 6.0
                        Microsoft Internet Explorer      7.0.5730.13
                        Microsoft .NET Framework      2.0.50727.42
                        操作系统      5.1.2600
        错误信息:找不到sqljdbc_xa.dll模块等。
我的操作步骤:
        参考微软官方MSDN进行的,详细步骤如下:
        一、启动MSDTD服务
         1)打开【控制面板】- 【管理工具】- 【组件服务】;
         2)展开【控制台根目录】- 【组件服务】- 【计算机】- 【我的电脑】,右键,选择【属性】;
         3)选择【MSTDC】选项卡,选择【安全性配置】;
         4)选择【启用XA事务】,确定后,重新启动MS DTC服务后,关闭【组件服务】;
        二、安装JDBC Distributed Transaction Components
         1)复制sqljdbc_xa.dll从JDBC安装目录到SQL Server 安装目录\Binn下(注:SQL SERVER安装在D盘,部分在
         C盘);
                注:如果使用的是32位SQL SERVER,使用X86下的sqljdbc_xa.dll文件。如果使用的是64位SQL SERVER,使
          用X64下的sqljdbc_xa.dll文件。
         2)在安装了SQL SERVER实例上运行xa_install.sql;
        三、重新启动服务器。
        四、测试
问题解决方法:
         经过上述步骤处理后,出现了如问题背景中的错误信息。虽然检查了各项设置以及SQL SERVER的各项服务状态
     都没什么问题,但问题依旧。
         在没有头绪的情况下,由另一位同事对相关操作进行了检查,发现在C盘的安装目录下没有sqljdbc_xa.dll文件,
     重新复制文件后尝试,问题成功解决。
         所以,建议如果不清楚文件的复制位置的话,在两个文件下都拷贝一个。除此以外,SQL SERVER版本及防火墙
     是否启用等都可能对服务的正常使用产生影响。
        在有些文章中提到SQL SERVER Browser服务的未启动也会造成相关服务不能正常使用,但自己没有对此类方法
     进行验证,不好确认。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL XA事务是一种分布式事务处理方式,它允许多个独立的事务同时访问多个数据库,并将它们作为一个全局事务进行处理,从而保证了数据的一致性和完整性。 在MySQL 5.7中,XA事务的实现基于两个重要的组件:XA接口和InnoDB存储引擎。XA接口提供了一组标准API,使得应用程序可以以统一的方式与分布式事务协调器进行通信,而InnoDB存储引擎则提供了具体的XA事务实现。 要使用MySQL XA事务,需要确保以下几点: 1. 数据库支持XA协议,如MySQL 5.7及以上版本。 2. 数据库引擎支持XA事务,如InnoDB存储引擎。 3. 应用程序使用XA接口与协调器进行通信。 4. 执行XA事务的数据库必须在同一个XA事务中注册。 在使用MySQL XA事务时,需要对事务进行以下基本操作: 1. 准备(prepare):在分布式事务中,每个数据库都会先执行准备操作,以确保所有数据库都可以成功执行事务。 2. 提交(commit):当所有数据库都准备好时,可以执行提交操作,将分布式事务提交到所有数据库。 3. 回滚(rollback):如果任意一个数据库无法完成准备或提交操作,则需要执行回滚操作,以确保所有数据库都回到事务开始前的状态。 总的来说,MySQL XA事务是一种非常强大的分布式事务处理方式,可以实现多个独立的事务同时访问多个数据库,并将它们作为一个全局事务进行处理,从而保证了数据的一致性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值