JTA分布式事务实战(atomikos)

标签: jta 分布 务实 | 发表时间:2014-01-18 23:34 | 作者:还可以
出处:http://www.iteye.com

最近需要用到分布式事务,研究了下jta,使用了atomikos这个jta的实现,使用的是spring3.0,废话少说,直接贴代码。

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 version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"  
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
    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"  
    default-lazy-init="true">  
  
  	
  	<context:component-scan base-package="com.atom.jta.test" />
  
    <!-- atomikos事务管理器 -->  
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"  
        init-method="init" destroy-method="close">  
        <description>UserTransactionManager</description>  
        <property name="forceShutdown">  
            <value>true</value>  
        </property>  
    </bean>  
  
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
        <property name="transactionTimeout" value="300" />  
    </bean>  
  
    <!-- spring 事务管理器 -->  
    <bean id="springTransactionManager"  
        class="org.springframework.transaction.jta.JtaTransactionManager">  
        <property name="transactionManager">  
            <ref bean="atomikosTransactionManager" />  
        </property>  
        <property name="userTransaction">  
            <ref bean="atomikosUserTransaction" />  
        </property>  
        <property name="allowCustomIsolationLevels" value="true">
        </property>
    </bean>  
    
    <!-- 事务拦截器 -->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<!-- 配置事务管理器 -->
		<property name="transactionManager" ref="springTransactionManager" />
		<!-- 方法名:要求的事务属性 -->
		<property name="transactionAttributes">
			<props>
				<prop key="insertTest">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ,-Throwable
				</prop>
			</props>
		</property>
	</bean>
	
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>atomTransactionServiceImpl</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value>
			</list>
		</property>
	</bean>
</beans>  

 

 

2.数据源:

datasource1:

 

package com.atom.jta.test;

import java.util.Properties;

import org.springframework.stereotype.Repository;

import com.atomikos.jdbc.AtomikosDataSourceBean;
@Repository
public class MasterAtomDatasource extends AtomikosDataSourceBean {
	
	private static final long serialVersionUID = -2471230875536339311L;

	public MasterAtomDatasource(){
		Properties prop = new Properties();
		prop.put("user", "root");
		prop.put("password", "");
		prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true");
		setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
		setUniqueResourceName("mysql_ds1");
		setPoolSize(5);
		setXaProperties(prop);
	}
	
}

 datasource2:

 

 

package com.atom.jta.test;

import java.util.Properties;

import org.springframework.stereotype.Repository;

import com.atomikos.jdbc.AtomikosDataSourceBean;
@Repository
public class SlaveAtomDataSource extends AtomikosDataSourceBean {

	private static final long serialVersionUID = -6210394799199416765L;
	public SlaveAtomDataSource(){
		Properties prop = new Properties();
		prop.put("user", "root");
		prop.put("password", "");
		prop.put("URL", "jdbc:mysql://127.0.0.1:3306/test1?autoReconnect=true");
		setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
		setUniqueResourceName("mysql_ds2");
		setPoolSize(5);
		setXaProperties(prop);
	}
	

}

 

 

3.BaseDao:

package com.atom.jta.test;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class AtomBaseDao {
	private JdbcTemplate mastTemplate;
	private JdbcTemplate slaveTemplate;
	
	public JdbcTemplate getMastTemplate() {
		return mastTemplate;
	}
	@Resource(name="masterAtomDatasource")
	public void setMastTemplate(DataSource source) {
		this.mastTemplate = new JdbcTemplate(source);
	}
	public JdbcTemplate getSlaveTemplate() {
		return slaveTemplate;
	}
	@Resource(name="slaveAtomDataSource")
	public void setSlaveTemplate(DataSource source) {
		this.slaveTemplate = new JdbcTemplate(source);
	}
	
	
}

 4.测试service

package com.atom.jta.test;

import org.springframework.context.ApplicationContext;

public interface AtomTransactionService {
	public void insertTest(ApplicationContext ctx) throws Exception;
}

 

package com.atom.jta.test;

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class AtomTransactionServiceImpl implements AtomTransactionService {
	public void insertTest(ApplicationContext ctx) throws Exception {
		AtomBaseDao baseDao = ctx.getBean(AtomBaseDao.class);
		String str = "xxxx";
		String masterSql = "insert into demo (name) values "+"('"+str+"')";
		String slaveSql = "insert into test (name) values "+"('"+str+"')";
		baseDao.getMastTemplate().execute(masterSql);
		baseDao.getSlaveTemplate().execute(slaveSql);
		throw new Exception();
	}

}

 5.事务测试

package com.atom.jta.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AtomTest {
	public AtomTest(){
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-atomikos.xml");
		AtomTransactionService service = ctx.getBean(AtomTransactionService.class);
		try {
			service.insertTest(ctx);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		AtomTest test = new AtomTest();
		System.out.println("done.....");
	}

}

 就是如此简单



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jta 分布 务实] 推荐:

JTA分布式事务实战(atomikos)

- - 企业架构 - ITeye博客
最近需要用到分布式事务,研究了下jta,使用了atomikos这个jta的实现,使用的是spring3.0,废话少说,直接贴代码. 2.spring配置文件如下:. . . . .

spring+hibernate+JTA 分布式事务的例子 .

- - 编程语言 - ITeye博客
对于横跨多个Hibernate SessionFacotry的分布式事务,只需简单地将 JtaTransactionManager 同多个 LocalSessionFactoryBean 的定义结合起来作为事务策略. 你的每一个DAO通过bean属性得到各自的 SessionFactory 引用. 如果所有的底层JDBC数据源都是支持事务的容器,那么只要业务对象使用了 JtaTransactionManager 作为事务策略,它就可以横跨多个DAO和多个session factories来划分事务,而不需要做任何特殊处理.

什么是JTA 的 两段提交

- - 研发管理 - ITeye博客
事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性. A是Atomicity,原子性. 一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操作成 功,而另外一部分操作没有成功. 如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态.

JTA 深度历险 - 原理与实现(非原创)

- - 企业架构 - ITeye博客
转自:http://www.ibm.com/developerworks/cn/java/j-lo-jta/#ibm-pcon. 在 J2EE 应用中,事务是一个不可或缺的组件模型,它保证了用户操作的 ACID(即原子、一致、隔离、持久)属性. 对于只操作单一数据源的应用,可以通过本地资源接口实现事务管理;对于跨数据源(例如多个数据库,或者数据库与 JMS)的大型应用,则必须使用全局事务 JTA (Java Transaction API).

微服务实现简单的分布式日志追踪

- - DockOne.io
最近想给项目添加一个简单的分布式请求跟踪功能,从前端发起请求到网关,再从网关调用 Spring Cloud 的微服务,这些过程中希望能从日志中看到一个分布式 ID 的链路,通过请求的 ID 可以追踪整一条链路,方便问题的排查. 现成的方案自然是使用 SkyWalking 、 Spring Cloud Sleuth 、Zipkin 之类的组件,但是想到主要的目的记录一个可以一直贯通各个服务的 ID,方便日志查询,也就不想引入太多复杂的组件,最终决定通过 MDC 在日志中输出追踪的 ID,然后在 Feign 和 RestTemplate 中将请求 ID 在微服务中传递.

终于有人把“TCC分布式事务”实现原理讲明白了! - JaJian - 博客园

- -
之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下. 很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 首先说一下,这里可能会牵扯到一些 Spring Cloud 的原理,如果有不太清楚的同学,可以参考之前的文章:.

分布式日志

- - Java - 编程语言 - ITeye博客
最近完成一个简单的日志管理系统,拿出来跟大家分享一下. 3、支持文件输出、habse输出、mongodb输出. 基于以上三点功能,我们下面详细说明. 说道支持这个功能,有个同事认为没有这个必要,他的观点是log4j的配置不需要经常变动,不需要支持这样的功能;本人的观点是“配置可以进行统一管理、而且正式机跟测试机的log4j的配置肯定会有一些差异的”,因此这个功能是必须的.

分布式事务简述

- If you are thinking one year ahead, you plant rice. If you are thinking twenty years ahead, you plant trees. If you are thinking a hundred years ahead, you educate people. - BlogJava-首页技术区
  随着系统越来越大,不断的模块化和SOA化,你的系统可能被分散于不同的机器上,这时候,你原先的单机本地事务可能已经无法满足你的需求,你可能要跨系统跨资源的去使用事务.   具体就不多介绍了,相信大家都能明白ACID特性的基本含义. 而一个具体的事务需要涉及到的模型(无论哪种模型)一般由下面几部分组成:.

Hadoop与分布式计算

- 透明 - 丕子
写本文由leftnoteasy发布于http://leftnoteasy.cnblogs.com 本文可以被全部或者部分的使用,但请注明出处,如果有问题,可以联系wheeleast (at) gmail.com, 也可以加作者的新浪微博:http://weibo.com/leftnoteasy. 很久没有写写博客了,之前主要是换工作,耽误了很多的时间,让人也变得懒散,不想花大时间来写东西.

分布式缓存-Memcached

- - 人月神话的BLOG
分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性). 分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制. 其次是分布式管理和分布式算法,其次是缓存键值管理和路由. 原文: http://wenku.baidu.com/view/8686d46c7e21af45b307a8c3.html.