J2EE技术规范(七)——JTA(理解JTA,编写简单的事务客户程序)

本文介绍了WebLogic Server如何使用JTA1.0.1a进行事务管理,包括创建XID、支持事务名称、跟踪事务对象等。详细阐述了事务的范围,如EJB、JDBC和JMS的交互,并讨论了事务中的异常处理,特别是EJB和JDBC操作可能抛出的异常。同时,提供了捕获异常和回滚事务的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的内容中,写了几篇关于J2EE规范的博客,现在继续来完善这些内容,这次内容主要补充上一篇博客。

WebLogic Server使用JTA1.0.1a实现和管理事务

WebLogic Server提供以下支持:

  • 创建唯一的事务标记符(XID)
  • 支持可选的事务名称
  • 跟踪事务涉及的对象
  • 通知事务的数据库
  • 使用XA改写2PC
  • 执行回滚
  • 在失败时执行自动的恢复过程
  • 管理超时

处理事务的步骤:

事务的范围:

事务能够横跨:

  • EJB访问
  • JDBC连接
  • JMS连接

事务中的EJB和JDBC的示例

事务能够横跨EJB方法调用和JDBC连接的混合方式:

...
Context tc=new InitialContext();
UserTransaction ut=(UserTransaction)
	ic.lookup("javax.transaction.UserTransaction");
MyEJBHome ejbhome=(MyEJBHome)
	ic.lookup("java:com/env/ejb/MyEJBHome");
MyEJB ejb=ejbHome.create();
DataSource ds=(DataSource)
	ic.lookup("java:com.env/jdbc/myDB");
connection con=ds.getConnection();
Statement stmt=con.createStatement();
ut.begin();
ejb.methodA();
ejb.methodB();
stmt.executeQuery(...);
stmt.executeUpdate(...);

事务中的异常

Servlets必须意识到异常和它们在事务方面的实现

事务中涉及的EJBs可能抛出以下异常:

  • Application exceptions(应用异常)——如果EJB将事务标记为回滚,那么客户程序只能回滚。如果没有标记回滚,那么客户程序可以提交或回滚。
  • 系统或非应用异常——事务被标记为回滚。客户程序只能回滚

一、在事务中涉及的JMS操作可能抛出JMSException

(1)在事务中涉及的JDBC操作可能抛出SQLException

(2)在这两种情况中,客户程序都可以提交或回滚。

捕获异常和回滚的示例

(1)遇到失败事件时,事务可以执行适当的清理操作:

...
Context ic=new InitialContext();
UserTransaction ut=(UserTransaction)
	ic.lookup("javax.transaction.UserTransaction");
ut.begin();
withdraw(fromAccount,amount);
Deposit(toAccount,amount);
Ut.commit();
}catch(CustomException e){
	System.out.println(e);
	try{
		ut.rollback();
}catch(SystemException se){
	System.out.println(e);
}catch(Exception e){
	System.out.println(e);
	}
}

JTA的内容就先讲到这里,我们接下来的博客会继续完善J2EE规范的其他博客。

Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中留言,我会及时回复的。 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/> <!-- JTA事务管理器 --> <bean id="myJtaManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="jotm"/> </property> </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="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> </property> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.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="${jdbc2.driver}"/> <property name="url" value="${jdbc2.url}"/> </bean> </property> <property name="user" value="${jdbc2.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..servi1ce*..*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="myJtaManager"> <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="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice ...... ...... ......
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值