最近用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>;