快速业务通道

事务策略: 客户端编排策略-了解如何实现可靠的基于客户端的事务策略 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
节,在大多数情况下,客户端层都需要使用程序化事务,除非它作为 Spring 托管 bean 在 Spring 上下文中运行。由于我在实现示例中使用的是 EJB3,因此我将展示使用程序化事 务的实现。您可以参考 “模型和策略概述” 或者 Spring Framework 文档,了解如何在 Spring 中使用 程序化事务(参见 参考资料)。

此外,如果您运行了一个外部客户端,则应该确保事务管理程序支持跨 JVM 传播事务。在我的示例中 ,我使用 JBoss 4.2.0、EJB 3.0、Java Persistence API (JPA) 和 Hibernate 3.2.3,并运行使用 InnoDB 引擎的 MySQL 5.0.51b。这种环境(特别是 JBoss)支持跨多个 JVM 传播客户端事务(使用 RMI-IIOP)。

我将从读操作开始,因为它们是最早出现的。对于在客户端层发起的数据库读操作,从事务的角度来 说您不需要对客户端代码执行任何操作,因为数据库读操作不需要事务(参见 “了解事务陷阱” 中的 了解事务陷阱 侧栏)。但是,通过 API 层事务策略,您会希望将 API 层读操作方法设置为 SUPPORTS, 以确保在作用域的上下文中调用读方法时,它将包含在事务作用域中。

清单 1 演示了一个简单的调用读操作的客户端层方法。注意,getTrade() 读方法中不需要事务逻辑 :

清单 1. 读操作 — 客户端层

   
package com.trading.client; 
 
import javax.naming.InitialContext; 
import com.trading.common.TradeData; 
import com.trading.common.TradingService; 
 
public class TradingClient { 
 
  public static void main(String[] args) { 
   new TradingClient().getTrade(); 
  } 
 
  public void getTrade() { 
   try { 
     InitialContext ctx = new InitialContext(); 
     TradingService service = (TradingService) 
      ctx.lookup("TradingServiceImpl/remote"); 
  
     TradeData trade = service.getTrade(11); 
     System.out.println(trade);  
   } catch (Exception e) { 
     e.printStackTrace(); 
   } 
  } 
}

事务策略: 客户端编排策略-了解如何实现可靠的基于客户端的事务策略(4)

时间:2011-10-21 IBM Mark Richards

TradingServiceImpl EJB3 无状态会话 bean 中的相应 getTrade() API 层读方法如清单 2 所示:

清单 2. 读操作 — API 层

   
package com.trading.server; 
 
import javax.ejb.Stateless; 
import javax.ejb.Remote; 
import javax.ejb.TransactionAttribute; 
import javax.ejb.TransactionAttributeType; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
 
import com.trading.common.TradeData; 
import com.trading.common.TradingService; 
 
@Stateless 
@Remote(TradingService.class) 
public class TradingServiceImpl implements TradingService { 
  @PersistenceContext EntityManager em; 
  
  @TransactionAttribute(TransactionAttributeType.SUPPORTS) 
  public TradeData getTrade(long tradeId) throws Exception { 
   return em.find(TradeData.class, tradeId); 
  }  
}

注意,清单 2 中使用了 SUPPORTS 事务属性,这表示如果此方法是独立调用的,那么它将不会开始事 务,但如果它是在已有事务中调用的话,则会使用一个已有的事务上下文。

对于数据库更新操作、客户端层,作为事务所有者,负责获取事务管理程序,开始事务,然后提交事 务或者根据操作的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号