`
y806839048
  • 浏览: 1119237 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

分布式事物示例3

阅读更多

如果容器支持jta,那么spring配置起来非常简单,因为spring提供了JtaTransactionManager,在这里面提供了几乎所有的服务器的jta的jndi名字,比如

* "java:comp/UserTransaction" for Resin 2.x, Oracle OC4J (Orion), JOnAS (JOTM), BEA WebLogic

* "java:comp/TransactionManager" for Resin 3.x

* "java:appserver/TransactionManager" for GlassFish

* "java:pm/TransactionManager" for Borland Enterprise Server and Sun Application Server (Sun ONE   7 and later)

* "java:/TransactionManager" for JBoss Application Server

 

由于大部分服务器获取jta的方式都不尽相同,spring还针对不同的服务器提供了不同的jta实现,例如:

WebLogicJtaTransactionManager

WebSphereUowTransactionManager

OC4JJtaTransactionManager

 

不管是jdbc、hibernate还是ibatis,都可以通过JtaTransactionManager来配置分布式事务

分布式事务是指操作多个数据库之间的事务,spring的org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持。如果使用WAS的JTA支持,把它的属性改为WebSphere对应的TransactionManager。

 

在tomcat下,是没有分布式事务的,不过可以借助于第三方软件jotm(Java Open Transaction Manager )和AtomikosTransactionsEssentials实现,在spring中分布式事务是通过jta(jotm,atomikos)来进行实现。

1.ProductDao.java

package com.spring.jtaTransactionManager;


public interface ProductDao {
	
	public void save(String sql);
	
	public void save(String sqlA, String sqlB);
}
  2.ProductDaoImpl.java
package com.spring.jtaTransactionManager;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;


@Repository("productDao")
public class ProductDaoImpl implements ProductDao {
	
	@Resource
	private JdbcTemplate jdbcTemplateA;
	
	@Resource
	private JdbcTemplate jdbcTemplateB;

	@Override
	public void save(String sql) {
		jdbcTemplateA.execute(sql);
		
	}

	@Override
	public void save(String sqlA, String sqlB) {
		jdbcTemplateA.execute(sqlA);
		jdbcTemplateB.execute(sqlB);
		
	}
}
3.ProductManager.java
package com.spring.jtaTransactionManager;


public interface ProductManager {
	
	public void save(String sql);
	
	public void save(String sqlA, String sqlB);

}
4.ProductManagerImpl.java
package com.spring.jtaTransactionManager;


import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service("productManager")
public class ProductManagerImpl implements ProductManager{
	
	@Resource
	private ProductDao productDao;
	
	@Override
	public void save(String sql) {
		
		productDao.save(sql);
	}

	@Override
	public void save(String sqlA, String sqlB) {
		productDao.save(sqlA, sqlB);
	}
}
5.SimpleSpringJtaDemo.java
package com.spring.jtaTransactionManager;

import java.sql.SQLException;

import javax.naming.NamingException;

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

public class SimpleSpringJtaDemo {

	public static void main(String[] args) throws NamingException, SQLException {
		ApplicationContext app = new FileSystemXmlApplicationContext("src/com/spring/jtaTransactionManager/spring-jta.xml");
		
		ProductManager p = (ProductManager)app.getBean("productManager");

		String sqlA = "INSERT INTO t_product VALUES (1, 'Jta测试事务');";
		String sqlB = "INSERT INTO t_receiver VALUES (1,'Jta测试事务');";
		p.save(sqlA, sqlB);
	}
	
}
6.configuration.properties
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://127.0.0.1/jinhonglun?useEncoding=true&characterEncoding=UTF-8
database.username=root
database.password=root
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=true


database2.driver=com.mysql.jdbc.Driver
database2.url=jdbc:mysql://127.0.0.1/winchannel?useEncoding=true&characterEncoding=UTF-8
database2.username=root
database2.password=root
hibernate2.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate2.show_sql=true
7.spring-jta.xml
<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	 <description>springJTA</description>
	 <!-- 自动扫描包,自动将@Repository、@Service、@Controller 和 @Component自动实例化 -->
	 <context:component-scan base-package="com.spring.jtaTransactionManager" />
	<!--指定Spring配置中用到的属性文件-->
	<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:/com/spring/jtaTransactionManager/configuration.properties</value>
			</list>
		</property>
	</bean>
	<!-- JOTM实例 -->  
	<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean">  
		  <property name="defaultTimeout" value="500000"/>  
	</bean>
	<!-- JTA事务管理器 -->  
	<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">	 
		<property name="userTransaction" ref="jotm" />	 
	</bean>
	<!-- 数据源A -->   
	<bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">   
	   <property name="dataSource">   
		   <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">   
			   <property name="transactionManager" ref="jotm"/>   
			   <property name="driverName" value="${database.driver}"/>   
			   <property name="url" value="${database.url}"/>   
		   </bean>   
	   </property>   
	   <property name="user" value="${database.username}"/>   
	   <property name="password" value="${database.password}"/>   
	</bean>   
	<!-- 数据源B -->   
	<bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">   
	   <property name="dataSource">   
		   <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">   
			   <property name="transactionManager" ref="jotm"/>   
			   <property name="driverName" value="${database2.driver}"/>   
			   <property name="url" value="${database2.url}"/>   
		   </bean>   
	   </property>   
	   <property name="user" value="${database2.username}"/>   
	   <property name="password" value="${database2.password}"/>   
	</bean>   
	<bean id = "jdbcTemplateA"   
		 class = "org.springframework.jdbc.core.JdbcTemplate">   
		 <property name = "dataSource" ref="dataSourceA"/>   
	</bean>  
	<bean id = "jdbcTemplateB"   
		 class = "org.springframework.jdbc.core.JdbcTemplate">   
		 <property name = "dataSource" ref="dataSourceB"/>   
	</bean>
	 <!-- 事务切面配置 -->   
	<aop:config>   
		<aop:pointcut id="pointCut" expression="execution(* com.spring.jtaTransactionManager..*.*(..))"/><!-- 包及其子包下的所有方法 -->  
		<aop:advisor pointcut-ref="pointCut" advice-ref="txAdvice"/>   
	</aop:config>   
	<!-- 通知配置 -->   
	<tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">   
	   <tx:attributes>   
		  <tx:method name="delete*" rollback-for="Exception"/>   
		  <tx:method name="save*" rollback-for="Exception"/>   
		  <tx:method name="update*" rollback-for="Exception"/>   
		  <tx:method name="find*" read-only="true" rollback-for="Exception"/>   
	   </tx:attributes>   
	</tx:advice>
</beans>
后续还会,补充对应的其他hibernate的JtaTransactionManager处理方式
分享到:
评论

相关推荐

    XA 多数据源分布式事物实现 java

    本项目"XA 多数据源分布式事物实现 java"提供了一个基于Java实现的分布式事务管理方案,适用于需要跨多个数据源进行事务操作的场景。 首先,我们要理解什么是XA。XA是由开放组(The Open Group)制定的一套分布式...

    seata分布式事物模型代码

    本压缩包“seata-demo”包含了一个Seata的示例项目,旨在帮助开发者了解和学习如何在实际应用中使用Seata进行分布式事务管理。通过这个示例,我们可以深入理解Seata的核心机制和使用方式。 1. **Seata的工作原理** ...

    C#数据库分布式事物使用

    TransactionDemo可能包含了实现上述概念的示例代码,包括创建TransactionScope对象,执行SQL操作,以及处理事务边界条件。分析这些代码可以帮助理解如何在实际项目中应用分布式事务。 总的来说,C#的数据库分布式...

    spring+mybatis+jta实现多数据源的分布式事物(代码可以直接运行)

    综上所述,"spring+mybatis+jta实现多数据源的分布式事物"项目为开发者提供了一个实用的示例,帮助他们了解和掌握在实际应用中如何处理复杂的事务场景。通过这个项目,开发者可以学习到Spring的事务管理、MyBatis的...

    net 2.0 分布式事务解决方案有原代码

    3. 分布式事务协调器(DTC):在.NET 2.0中,分布式事务通常由Microsoft Distributed Transaction Coordinator (MSDTC)来协调。MSDTC负责跟踪事务状态,确保所有参与方都能看到事务的全局视图,从而进行正确的提交或...

    记录redisson实现redis分布式事务锁

    在Spring Boot项目中,`spring-boot-distributed-redisson-master`这个文件名可能表示的是一个包含示例代码的仓库,它演示了如何将Redisson集成到Spring Boot应用中,并实现分布式锁。通过这个项目,你可以深入理解...

    TCC-Transaction分布式事务DEMO

    在这个"TCC-Transaction分布式事务DEMO"项目中,开发者已经实现了一个可运行的示例,展示了如何在Maven项目中集成TCC模式,并利用Mysql数据库进行分布式事务的处理。通过分析和学习这个DEMO,我们可以更好地理解TCC...

    基于Hyperf框架的TCC分布式事务组件.zip

    3. **Coordinator**:协调器是TCC框架的核心,它管理所有事务的状态,调度TCC动作的执行顺序,并处理可能的补偿操作。 在"hyperf-tcc-main"这个压缩包中,应该包含了以下内容: - **源代码示例**:展示了如何在...

    VS2005自动事物处理示例

    本示例"VS2005自动事物处理示例"旨在演示如何在Visual Studio 2005(VS2005)环境中利用C#语言进行自动事物处理,以确保数据一致性。在多数据库操作或涉及多个系统的业务流程中,事物处理扮演着关键角色,如在模拟的...

    Springboot-dubbo-fescar 阿里分布式事务的实现方法

    3. **项目结构**:典型的分布式应用中,会包含多个微服务,如库存(storage)、账号(account)和订单(order)。在购买流程中,库存服务首先减少商品库存,接着订单服务更新用户账户余额并创建订单。订单服务也会...

    spring整合atomikos实现分布式事务的方法示例

    Spring 整合 Atomikos 实现分布式事务是解决在分布式环境下多个数据库操作一致性问题的关键技术。Atomikos 是一个开源的事务管理器,它为 Java 平台提供了强大的支持,特别是处理跨越多个数据库的事务需求。在分布式...

    Springboot 动态多数据源 jta分布式事务

    最后,压缩包中的`demo`文件很可能是包含了上述配置和示例代码的项目模板。你可以下载并运行这个项目,通过阅读和理解代码,来更直观地学习如何在Spring Boot中实现动态多数据源和JTA分布式事务。 总之,Spring ...

    面向对象的分布式爬虫框架xxl-crawler

    面向对象编程是一种程序设计范型,它将现实世界中的事物抽象为对象,通过对象之间的交互来完成任务。XXL-Crawler 将爬虫任务的各个部分,如网页下载、解析、调度等,设计为独立的对象,使得代码更易于理解和维护。 ...

    springCloud-rabbitmq分布事物实现.zip

    本实例将详细讲解如何利用RabbitMQ解决分布式事务,通过基于Spring Cloud搭建的示例来阐述相关技术点。 首先,RabbitMQ是一个开源的消息代理和队列服务器,它允许应用程序之间异步通信。在分布式事务中,RabbitMQ...

    事物JPA入门

    **事物(Transaction)JPA 入门** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化Java对象到关系数据库。它提供了一种面向对象的方式来处理数据库操作,使得开发人员可以避免直接编写SQL,...

    事物管理javaweb.zip

    在"事物管理javaweb.zip"中,可能包含的详细内容有:JDBC事务示例代码、EJB事务配置、Spring事务管理的配置文件和注解使用、事务隔离级别的解释与选择、分布式事务的实现机制等。学习这些内容可以帮助开发者更好地...

    spring事物和rabbitMQ的例子

    本示例聚焦于Spring的事务管理和RabbitMQ的使用,这都是分布式系统中不可或缺的组件。 首先,让我们深入了解Spring的事务管理。在Java环境中,事务管理是确保数据一致性的重要手段。Spring提供了一种声明式事务管理...

    EJB实体Bean与事物管理

    企业级JavaBean(Enterprise JavaBeans,简称EJB)是Java平台上的一个核心组件,用于构建可部署在服务器端的分布式应用程序。在EJB规范中,实体Bean(Entity Bean)是一种特殊类型的组件,用于持久化数据到数据库,...

    tcc-transaction-master-1.2.x.rar

    3. **Cancel阶段**:如果Try阶段有任一服务失败或者在Confirm阶段出现异常,服务消费者需要调用Cancel接口,撤销之前Try阶段所做的预留操作,恢复系统到初始状态。 "Tcc-transaction-master-1.2.x"项目中,包含了...

    Storm:使用 Apache Storm 的示例

    TODO:添加一些关于在本地模式下运行事物的注释 分布式模式 要以分布式模式运行拓扑,您需要一个 Storm 集群,或者只是一个 VM。 以下部分将解释如何在 Linux VM 上安装 Storm。 安装风暴服务器 这些说明是通过阅读...

Global site tag (gtag.js) - Google Analytics