容器管理事务
http://www.ibm.com/developerworks/cn/opensource/os-ag-ejbtrans1/
Bean 管理事务
http://www.ibm.com/developerworks/cn/opensource/os-ag-ejbtrans2/
2007-7-9 19:16:59
查看评语»»»
2007-7-9 19:17:54 Weblogic8.1实现(CMT)及spring管理JTA事务
最近偶参与一个J2EE项目,应用架框是struts+spring! 持久层用hibernate,由于业务需要,业务数据来源来二个不同的数据库数据库是Orcale,版本是9.0.1.0.0。由于采用容器管理事务(CMT),对于Spring,一般普通业务应用我用声明式事务,因为这样让代码清洁一点,只有对于特殊的业务我才用编程式事务,如大批量更新时调用存储过程。对于WebLogic Server,JTA TransactionManager的正式JNDI位置是javax.transaction.TransactionManager。在Spring 的JtaTransactionManager中,该值可被指定为“transactionManagerName”。这启用了使用WebLogic JTA子系统的Spring驱动的事务挂起激活了对PROPAGATION_REQUIRES_NEW和PROPAGATION_NOT_SUPPORTED的支持。对于声明式事务我配置在spring的service层,对于编程式事务则在持久层。
下面说一下我的系统分层:acton==>service==>serviceImpl===>DAO===>DAOImpl,由业务层的实现类调用持久层的DAO接口,为了避免DAO的过度设计而使重用性降低,我这里每一个DAO接口对应操作数据库表,由spring的IOC容器注入,这样在serviceImpl层中可以最大程序的重用DAO。因为由于业务需要一个serviceImpl需要从两个数据库中交换数据。操作DAO可以保证处于同一个事务中......
事务的属性和基本概念
Required:
如果在一个事务中调用,就把该方法加到此事务中来,如果还没有启动事务,就启动一个新事务。
RequiredNew:
不管当前有没有事务,都会启动一个新事务,如果当前有事务,会被挂起直到方法结束。
NotSupported:
不能在事务中执行此方法。如果有事务,将会被挂起直到方法结束。
Supports:
如果当前有事务,此方法会加到当前事务,如果没有,容器也不会启动新事务。
Mandatory:
必须在事务中调用此方法,否则抛出异常:TransactionRequiredException。
Never:
必须不在事务中调用此方法,否则抛出RemoteException(远程调用)或EJBException(本地调用)
以下FAQ来自http://dev2dev.bea.com.cn
Q:XA 的Driver 和普通的Driver 有什么区别呢?
A: XA 的Driver 支持分布式的事务处理,这是与non xa driver 的最大区别;JDBC2.0 规范提供了进行分布式事务的能力。分布式事务是个单独的事务,可以应用在位于分离服务器上的多个异构数据库。为了支持分布式事务, JDBC2.0 提供了两个新的接口:javax.sql.XADataSource 和javax.sql.XAConnection。从性能的考虑来说,使用XA 的DRIVER
会比普通的DRIVER 慢。
Q: XA 的连接池,选择了支持本地事务后,是否还支持对全局的操作?
A: 8.1 既支持TX,也支持Non-Tx 的,Weblogic 对所有的已知数据库进行了包装(Wrapper),使接口一致,然而对不同的数据库,根据选择的驱动程序不同,都作了相应的优化和处理。建立数据源时,如果选择Non-Tx 类型,那么它参与到JTA 事务中也不会出错,因为Weblogic 会启动本地事务,但是前提是必须有一个资源(XAResource)参与到事务中(多个资源的话必须打开模拟两
阶段提交协议,不然会出错),但是选择Tx 类型的就必须有一个全局事务,除非选择支持本地事务(SupportsLocalTransaction=true)。另外如果使用了本地事务,就必须设置autocommit 为true,或者手工commit/rollback。
Q: 资料上讲distributed transaction 只能用JTA 的XAResource 来控制事务,如JMS 要参加分布式事务的话就必须用XA 的。但是,我记得在我们的应用中如果在一个容器管理的事务中修改两个不同的数据库(这两个库在一台机器的同一个实例中),那么必须用XA 的driver,难道这也是一种distribued transaction 吗?(它们是同一种资源,都是JDBC,只是跨库而已,为什么属于分布式事务呢?)
A: 分布式事务分事务管理器,资源管理器,应用程序,以及底层事务通讯管理.在xa 中一个db就是一个资源.一个jms 也可以看作是一个资源,事务管理器就是协调这些资源进行统一commit 或者rollback 的,所以来说跨库就属于分布式事务了。
具体操作步骤:
1、Configure a new JDBC Connection Pool:先在weblogic console中配置连接池,这里用
Oracle's Deriver(Thin XA) Versions:8.1.7.9.0.1.9.2.0, 并把Supports Local Transaction勾上。
2、Configure a new JDBC Data Source:配置一个数据源,并绑定上面创建的连接池。
3、在spring的ApplicationContext.xml中配置:
1Jndi:
2 <bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
3 <property name="jndiName">
4 <value>ds1</value>
5 </property>
6 </bean>
7
8 <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
9 <property name="jndiName">
分享到:
相关推荐
这个实例可能涉及一个具体的EJB实体bean的实现,它展示了如何利用容器管理事务、持久化和生命周期。可能包括创建一个代表数据库表的bean类,定义相应的接口,设置JPA注解,编写部署描述符,并展示如何在客户端进行...
传统的全局事务管理方法是通过Enterprise JavaBeans (EJB) 的容器管理事务(CMT),但它与EJB紧密绑定,存在侵入性,并且需要应用服务器支持。 相反,局部事务是与特定资源(如JDBC连接)相关的,更容易使用,但不...
1. **源代码**:EJB3的bean类,可能使用了`@TransactionManagement(TransactionManagementType.CONTAINER)`注解来让容器管理事务。 2. **配置文件**:如`persistence.xml`,用于配置JPA实体管理和事务属性。 3. **...
声明式事务是通过在代码中配置事务管理器,然后在业务方法上添加注解或在XML配置文件中声明事务属性来实现事务管理,这种方式不需要修改业务逻辑代码,类似于以前的容器管理事务(Container Managed Transaction,...
- **容器管理事务(CMT)**:如EJB或Spring,由应用服务器自动管理事务边界,开发者只需关注业务逻辑。 - **编程式事务管理(PTM)**:如Spring的TransactionTemplate或AOP,开发者通过代码显式控制事务边界。 2....
在J2EE应用服务器中,可以配置容器管理事务,由服务器负责事务的生命周期,这样开发者无需直接处理事务的细节。 总之,Java提供了多种处理数据库事务的方法,如JavaBean中的JDBC事务和EJB组件,以及JTA事务。理解...
在EJB3中,容器管理事务(Container Managed Transactions, CMT)模式下,事务的边界由容器自动管理,这使得开发者可以更加专注于业务逻辑的编写。 #### 二、EJB3中的事务管理 在EJB3中,事务管理有两种模式:容器...
- `Container-managed transaction`(容器管理事务):EJB容器自动管理事务的开始和结束,适用于那些不需要复杂事务控制的简单场景。 - `Bean-managed transaction`(Bean管理事务):Bean自身控制事务的边界,这...
4. **容器管理事务**:Spring容器可以管理事务,根据配置自动处理事务边界,简化了事务管理。 在房屋管理系统中,SSH2框架可能用于以下功能: 1. **用户管理**:Struts2处理用户登录、注销,Spring验证用户信息,...
Spring.NET的核心组件包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)以及容器管理事务(Container Managed Transactions,CMT)。这些组件使得开发者能够更专注于...
**容器事务**:在J2EE环境中,容器(如WebLogic、JBoss、Tomcat等)可以自动管理事务。这种情况下,事务的声明和管理是在EJB(Enterprise JavaBeans)或其他类似组件的配置中完成的。容器根据事务的边界(如方法调用...
1. **容器管理事务**:应用服务器可以自动管理事务边界,减少开发者的负担。 2. **声明式事务管理**:通过配置而非代码控制事务,提高灵活性和可维护性。 #### 版权与许可 JTA规范的版权由Sun Microsystems Inc....
在需要事务控制的方法上添加这个注解,Spring会自动管理事务的开始、提交、回滚等操作。 2. 编程式事务管理: 编程式事务管理则是在代码中直接控制事务的开始、提交、回滚等操作,通常通过TransactionTemplate或...
在这个主题中,我们将深入探讨"spring3hibernate4注解式事务管理",了解如何通过注解来实现高效且简洁的事务控制。 首先,Spring 3 提供了基于注解的事务管理,这使得开发者无需编写大量XML配置就能进行事务管理。...
EJB支持两种事务管理方式:容器管理事务由EJB容器自动管理,适合大部分情况;而bean管理事务则由开发者自行控制,适用于更复杂的事务需求。理解何时使用哪种方式是至关重要的。 **7. 安全性模式** EJB提供了细粒度...
4.2 **容器管理事务**:说明如何通过 Spring 容器来自动管理事务,即开启事务支持,使得在 Spring AOP(面向切面编程)中定义的业务方法能够在同一个事务中执行。 **第五章:使用 SqlSession** 5.1 **...
使用Spring容器管理事务,可以避免手动控制事务,减少事务传播的复杂性。例如,在一个方法中调用了多个需要在同一个事务中执行的操作,Spring可以自动处理这些操作的事务边界,使得代码更加简洁。 【AOP(面向切面...