1. 程式人生 > >JTA分布式事務實戰

JTA分布式事務實戰

require tex title images utf ring nim throwable 管理器

spring3.0 分布式事務 jta atomikos

1.使用如下jar包

atomikos-util.3.7.0.jar

cglib-nodep-2.2.2.jar

transactions-3.7.0.jar

transactions-api-3.7.0.jar

transactions-jdbc-3.7.0.jar

transactions-jta-3.7.0.jar

2.spring配置文件如下:

Xml代碼 技術分享
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
  6. default-lazy-init="true">
  7. <context:component-scan base-package="com.atom.jta.test" />
  8. <!-- atomikos事務管理器 -->
  9. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
  10. init-method="init" destroy-method="close">
  11. <description>UserTransactionManager</description>
  12. <property name="forceShutdown">
  13. <value>true</value>
  14. </property>
  15. </bean>
  16. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  17. <property name="transactionTimeout" value="300" />
  18. </bean>
  19. <!-- spring 事務管理器 -->
  20. <bean id="springTransactionManager"
  21. class="org.springframework.transaction.jta.JtaTransactionManager">
  22. <property name="transactionManager">
  23. <ref bean="atomikosTransactionManager" />
  24. </property>
  25. <property name="userTransaction">
  26. <ref bean="atomikosUserTransaction" />
  27. </property>
  28. <property name="allowCustomIsolationLevels" value="true">
  29. </property>
  30. </bean>
  31. <!-- 事務攔截器 -->
  32. <bean id="transactionInterceptor"
  33. class="org.springframework.transaction.interceptor.TransactionInterceptor">
  34. <!-- 配置事務管理器 -->
  35. <property name="transactionManager" ref="springTransactionManager" />
  36. <!-- 方法名:要求的事務屬性 -->
  37. <property name="transactionAttributes">
  38. <props>
  39. <prop key="insertTest">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ,-Throwable
  40. </prop>
  41. </props>
  42. </property>
  43. </bean>
  44. <bean
  45. class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  46. <property name="beanNames">
  47. <list>
  48. <value>atomTransactionServiceImpl</value>
  49. </list>
  50. </property>
  51. <property name="interceptorNames">
  52. <list>
  53. <value>transactionInterceptor</value>
  54. </list>
  55. </property>
  56. </bean>
  57. </beans>

2.數據源:

datasource1:

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import java.util.Properties;
  3. import org.springframework.stereotype.Repository;
  4. import com.atomikos.jdbc.AtomikosDataSourceBean;
  5. @Repository
  6. public class MasterAtomDatasource extends AtomikosDataSourceBean {
  7. private static final long serialVersionUID = -2471230875536339311L;
  8. public MasterAtomDatasource(){
  9. Properties prop = new Properties();
  10. prop.put("user", "root");
  11. prop.put("password", "");
  12. prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true");
  13. setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
  14. setUniqueResourceName("mysql_ds1");
  15. setPoolSize(5);
  16. setXaProperties(prop);
  17. }
  18. }

datasource2:

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import java.util.Properties;
  3. import org.springframework.stereotype.Repository;
  4. import com.atomikos.jdbc.AtomikosDataSourceBean;
  5. @Repository
  6. public class SlaveAtomDataSource extends AtomikosDataSourceBean {
  7. private static final long serialVersionUID = -6210394799199416765L;
  8. public SlaveAtomDataSource(){
  9. Properties prop = new Properties();
  10. prop.put("user", "root");
  11. prop.put("password", "");
  12. prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test1?autoReconnect=true");
  13. setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
  14. setUniqueResourceName("mysql_ds2");
  15. setPoolSize(5);
  16. setXaProperties(prop);
  17. }
  18. }

3.BaseDao:

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import javax.annotation.Resource;
  3. import javax.sql.DataSource;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. import org.springframework.stereotype.Repository;
  6. @Repository
  7. public class AtomBaseDao {
  8. private JdbcTemplate mastTemplate;
  9. private JdbcTemplate slaveTemplate;
  10. public JdbcTemplate getMastTemplate() {
  11. return mastTemplate;
  12. }
  13. @Resource(name="masterAtomDatasource")
  14. public void setMastTemplate(DataSource source) {
  15. this.mastTemplate = new JdbcTemplate(source);
  16. }
  17. public JdbcTemplate getSlaveTemplate() {
  18. return slaveTemplate;
  19. }
  20. @Resource(name="slaveAtomDataSource")
  21. public void setSlaveTemplate(DataSource source) {
  22. this.slaveTemplate = new JdbcTemplate(source);
  23. }
  24. }

4.測試service

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. public interface AtomTransactionService {
  4. public void insertTest(ApplicationContext ctx) throws Exception;
  5. }

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class AtomTransactionServiceImpl implements AtomTransactionService {
  6. public void insertTest(ApplicationContext ctx) throws Exception {
  7. AtomBaseDao baseDao = ctx.getBean(AtomBaseDao.class);
  8. String str = "xxxx";
  9. String masterSql = "insert into demo (name) values "+"(‘"+str+"‘)";
  10. String slaveSql = "insert into test (name) values "+"(‘"+str+"‘)";
  11. baseDao.getMastTemplate().execute(masterSql);
  12. baseDao.getSlaveTemplate().execute(slaveSql);
  13. throw new Exception();
  14. }
  15. }

5.事務測試

Java代碼 技術分享
  1. package com.atom.jta.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class AtomTest {
  5. public AtomTest(){
  6. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-atomikos.xml");
  7. AtomTransactionService service = ctx.getBean(AtomTransactionService.class);
  8. try {
  9. service.insertTest(ctx);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. AtomTest test = new AtomTest();
  16. System.out.println("done.....");
  17. }
  18. }

JTA分布式事務實戰