快速业务通道

事务策略: API层策略-学习如何实现一个简单且健壮的事务策略 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
 throws Exception {     try {      //update account balance based on buy or sell...    } catch (Exception up) {      ctx.setRollbackOnly();      throw up;    }   } }

假设这些方法都可以作为独立的操作运行。然而,如清单 2 所示,很多时候客户机可以在相同的 LUW 中同时调用这两种方法:

清单 2. 在同一个客户机方法中执行多个表更新

public TradeData invokeClientRequest(TradeData trade) throws Exception { 
  try { 
   insertTrade(trade); 
   updateAcct(trade); 
   return trade; 
  } catch (Exception up) { 
   //log the error 
   throw up; 
  } 
}

事务策略: API层策略-学习如何实现一个简单且健壮的事务策略(6)

时间:2011-10-21 IBM Mark Richards

在这里,并没有将事务放在客户机层而搞乱所有内容,更好的办法是通过在 TradingServiceImpl 类 和相应的 TradingService 接口中创建新的聚合方法来移除多 API 层调用。清单 3 展示了这个新的聚合 方法(为简单起见,没有显示接口代码):

清单 3. 添加一个公共聚合方法

@Stateless
@Remote(TradingService.class)
public class TradingServiceImpl implements TradingService {
  @PersistenceContext(unitName="trading") EntityManager em; 
  @Resource SessionContext ctx;
  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public TradeData placeTrade(TradeData trade) throws Exception { 
   try { 
     insertTrade(trade); 
     updateAcct(trade); 
     return trade; 
   } catch (Exception up) { 
     ctx.setRollbackOnly();
     throw up; 
   }
  } 
  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public long insertTrade(TradeData trade) throws Exception { 
   ...
  }
  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void updateAcct(TradeData trade) throws Exception { 
   ...
  }
}

重构后的客户机代码如清单 4 所示:

清单 4. 重构后的客户机代码只发出一个 API 层调用

public TradeData invokeClientRequest(TradeData trade) throws Exception { 
  try { 
   return placeTrade(trade); 
  } catch (Exception up) { 
   //log the error 
   throw up; 
  } 
}

事务策略: API层策略-学习如何实现一个简单且健壮的事务策略(7)

时间:2011-10-21 IBM Mark Richards

注意,客户机方法现在对名为 placeTrade() 的 API 层中的新聚合方法发出了一个调用。 insertTrade() 和 updateAcct() 方法仍然是公共方法,因为它们可以彼此独立调用,而不用考虑新的聚 合方法。

尽管我使用了一个简单的示例进行说明,但是我并没有要刻意忽略这项重构技巧的复杂性。在某些情 况下(特别是使用 HTTPServletRequest 或 HTTPSession 等基于 Web 的对象的客户机代码)重构可以非 常复杂并涉及到大量的代码修改。您需要在重构客户机和服务器代码所需的工作量和对数据完整性、一致 性的需求之间做出权衡。就是说,现在需要考虑到实用性。要实现朝向可靠事务策略(比如本文描述的 API 层事务策略)的渐进式推进,可以临时向客户机代码添加事务逻辑,从而在同一个事务工作单元中保 持两个 API 层调用互相协调(确保 API 层仍然具有 REQUIRED 属性设置)。然而,您应当理解执行以下 操

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号