最近用atomikos的JTA二阶段提交解决多数据源的事务问题。服务在实验环境和测试环境下(oracle版本分别是11.2.0.1和11.2.0.2),跑起来是正常的,但当把服务部署到正式环境(oracle 11.2.0.4)后,奇怪的事情就发生了,一直打印警告 xa异常,具体的异常信息如下:
17:41:49.502 WARN 4924 --- [main] c.a.d.xa.XATransactionalResource : Error in recovery
javax.transaction.xa.XAException: null
at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:703)
at com.atomikos.datasource.xa.XATransactionalResource.recoverXidsFromXAResource(XATransactionalResource.java:554)
at com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:512)
at com.atomikos.datasource.xa.XATransactionalResource.recoverXidsFromResourceIfNecessary(XATransactionalResource.java:615)
at com.atomikos.datasource.xa.XATransactionalResource.endRecovery(XATransactionalResource.java:583)
at com.atomikos.icatch.imp.TransactionServiceImp.recover(TransactionServiceImp.java:558)
17:41:49.517 WARN 4924 --- [main] c.a.icatch.imp.TransactionServiceImp : ERROR IN RECOVERY
com.atomikos.datasource.ResourceException: Error in recovery
at com.atomikos.datasource.xa.XATransactionalResource.recoverXidsFromXAResource(XATransactionalResource.java:565)
at com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:512)
at com.atomikos.datasource.xa.XATransactionalResource.recoverXidsFromResourceIfNecessary(XATransactionalResource.java:615)
at com.atomikos.datasource.xa.XATransactionalResource.endRecovery(XATransactionalResource.java:583)
经过排查后,定位到有可能是oracle 11.2.0.4(这个应该是商业版,不能通过官网下载的)需要自行打开XA的支持,又经过好几个小时尝试后,使用 dba账号 通过以下命令给数据源的用户授予XA权限可以解决问题。
解决方案:
grant select on sys.dba_pending_transactions to <user name>;
grant select on sys.pending_trans$ to <user name>;
grant select on sys.dba_2pc_pending to <user name>;
grant execute on sys.dbms_system to <user name>;