一个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服务的未启动也会造成相关服务不能正常使用,但自己没有对此类方法
进行验证,不好确认。