如果容器支持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=true7.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处理方式
相关推荐
Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理:这是通过编写代码来控制事务的开始、提交和回滚。Spring 提供了PlatformTransactionManager接口,如...
在分布式事务场景下,Spring提供了JtaTransactionManager,支持JTA(Java Transaction API)进行全局事务管理,可以跨越多个数据库或资源进行事务控制。此外,Spring还支持Atomikos、Bitronix等第三方JTA实现。 在...
- `JTATransactionManager`:用于Java Transaction API (JTA)环境下的事务管理。 ##### 2. 使用示例 ```java // 创建事务定义 TransactionDefinition td = new DefaultTransactionDefinition(); // 获取事务管理...
Spring 的事务管理器提供了多种实现类,例如 DataSourceTransactionManager、HibernateTransactionManager、JdoTransactionManager、JtaTransactionManager 等,每个实现类代表不同的事务管理策略。这些实现类都...
其中,Spring的分布式事务管理是其核心特性之一,它允许开发者在分布式系统环境中处理复杂的事务逻辑。本篇将深入探讨Spring如何实现分布式事务,以及涉及到的相关技术。 首先,分布式事务是指在多个数据库或者服务...
Spring 提供了多种事务管理器,如`DataSourceTransactionManager`用于处理基于JDBC的数据源事务,`JtaTransactionManager`用于Java EE应用服务器上的JTA(Java Transaction API)事务管理,还有针对ORM框架如...
Spring框架在企业级Java应用中广泛用于实现事务管理,而JTA(Java Transaction API)是Java平台上的标准事务处理API,适用于分布式环境。本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的...
Spring的`PlatformTransactionManager`接口是所有事务管理器的基类,如JDBC的DataSourceTransactionManager和JTA的JtaTransactionManager。 **2. JOTM介绍:** JOTM是Java开放事务管理器,是一个开源的、符合JTA...
- `JtaTransactionManager`:支持全局事务管理(JTA)。 2. **TransactionDefinition**: TransactionDefinition接口定义了事务的规则,包括事务的名称、隔离级别、传播行为和超时时间,以及是否为只读事务。这些...
Spring的事务管理器,如DataSourceTransactionManager或JtaTransactionManager,会根据这些配置来决定何时开始、提交、回滚事务,以及在需要时如何暂停和恢复事务。 在Java后端开发中,Spring的事务管理机制大大...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。Spring提供了多种事务管理配置方式,适合不同的应用场景。本篇将详细讲解Spring中的事务管理配置,帮助初学者理解并掌握这一重要概念。...
在Spring中,`PlatformTransactionManager`接口是所有事务管理器的基类,如`DataSourceTransactionManager`用于JDBC事务,`HibernateTransactionManager`用于Hibernate事务,以及`JtaTransactionManager`用于JTA事务...
Spring 事务管理是Java开发中一个重要的组成部分,特别是在企业级应用中,确保数据一致性与安全性。Spring 提供了丰富的工具和策略来处理事务,既支持声明式事务管理,也支持编程式事务管理。 首先,事务处理的核心...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本篇文章将详细解析Spring中的事务类型,帮助你更好地理解和应用这些知识。 首先,Spring支持两种事务管理方式:编程式...
Spring框架在事务管理方面提供了两种主要的实现方式:编程式事务管理和声明式事务管理。本篇文章将重点关注声明式事务管理中的注解驱动方式,也就是基于`@Transactional`注解的事务实现。这种方式使得代码更加简洁,...
创建一个Spring配置文件,配置事务管理器,如DataSourceTransactionManager或JtaTransactionManager。然后在Service层类的方法上使用`@Transactional`注解。同时,确保Spring容器能够扫描到这些带有注解的类,并...
- 在Spring XML配置文件中,事务管理器(如`DataSourceTransactionManager`或`JtaTransactionManager`)通常会定义在`<bean>`标签中,并通过`<tx:annotation-driven>`来启用声明式事务管理。 5. **数据库兼容性**...
在实际开发中,Spring通常配合DataSourceTransactionManager或JtaTransactionManager使用,前者适用于单数据源环境,后者则支持JTA(Java Transaction API),可用于分布式事务管理。 至于`spring-tx-3.2.xsd`,这...
`<tx:annotation-driven>`标签用于启用基于注解的事务管理,而`<bean>`标签则用于定义TransactionManager bean,例如DataSourceTransactionManager或JtaTransactionManager。以下是一个简单的示例: ```xml ...