J2EE技术规范(七)——JTA(理解JTA,编写简单的事务客户程序)
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);
- }
- }