Spring使用JTA进行分布式事务管理
使用SpringJTA进行分布式事务管理,需要引入第三方UserTransaction。例如:JOTM、Atomikos
JOTM (Java Open Transaction Manager)是一个独立的开源事务管理器,它实现了 XA 协议并且与 JTA API 兼容。
Atomikos是一个公司的名字,AtomikosTransactionsEssentials是其开源的分布式事务软件包,而ExtremeTransactions是商业的分布式事务软件包。TransactionsEssentials是基于apache-license的,是JTA/XA的开源实现,支持Java Application和J2EE应用。
这里使用的是Atomikos作为事务管理器。
将Atomikos的dist目录下的所有jar包复制到工程下
配置DataSource:
<bean id="ds1" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>oracle/ds1</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaProperties"> <props> <prop key="URL">jdbc:oracle:thin:@localhost:1521:orcl</prop> <prop key="user">test1</prop> <prop key="password">test1</prop> </props> </property> <property name="poolSize"> <value>2</value> </property> <property name="maxPoolSize"> <value>30</value> </property> </bean>
配置SessionFactory:
<bean id="oracleSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="ds1"></property> <property name="packagesToScan" value="org/liny/entity"/> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> </props> </property> </bean>
配置JTA事务:
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"/> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown"> <value>true</value> </property> </bean> <bean id="jtaTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction" ref="atomikosUserTransaction"></property> <property name="transactionManager" ref="atomikosTransactionManager"></property> </bean>
<tx:annotation-driven transaction-manager="jtaTxManager"/>
在使用的过程中可能会出现诸多异常问题,大多是各个数据库权限问题引起的,这里整理出来些:
例如:
exception:【com.atomikos.datasource.ResourceException: Error in recovery 】
解决:
以SYSDBA登录SQL Plus
grant select on sys.dba_pending_transactions to 当前数据库用户;
grant select on sys.pending_trans$ to 当前数据库用户;
grant select on sys.dba_2pc_pending to 当前数据库用户;
grant execute on sys.dbms_system to 当前数据库用户;
到这里使用Spring的JTA分布式事务管理就搞定了。