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

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

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将事务标记为回滚,那么客户程序只能回滚。若是没有标记回滚,那么客户程序能够提交或回滚。
  • 系统或非应用异常——事务被标记为回滚。客户程序只能回滚

1、在事务中涉及的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规范的其余博客。
spa