快速业务通道

事务策略: 了解事务陷阱-在Java平台中实现事务时要注意的常见错误 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
-21 IBM Mark Richards

本地事务陷阱

最好先从最简单的场景开始,即使用本地事务,一般也称为数据库事务。在数据库持久性的早期(例 如 JDBC),我们一般会将事务处理委派给数据库。毕竟这是数据库应该做的。本地事务很适合执行单一 插入、更新或删除语句的逻辑工作单元(LUW)。例如,考虑清单 1 中的简单 JDBC 代码,它向 TRADE 表插入一份股票交易订单:

清单 1. 使用 JDBC 的简单数据库插入

@Stateless
public class TradingServiceImpl implements TradingService {
  @Resource SessionContext ctx;
  @Resource(mappedName="java:jdbc/tradingDS") DataSource ds;
  public long insertTrade(TradeData trade) throws Exception {
   Connection dbConnection = ds.getConnection();
   try {
     Statement sql = dbConnection.createStatement();
     String stmt =
      "INSERT INTO TRADE (ACCT_ID, SIDE, SYMBOL, SHARES, PRICE, STATE)"
     + "VALUES ("
     + trade.getAcct() + "'',''"
     + trade.getAction() + "'',''"
     + trade.getSymbol() + "'',"
     + trade.getShares() + ","
     + trade.getPrice() + ",''"
     + trade.getState() + "'')";
     sql.executeUpdate(stmt, Statement.RETURN_GENERATED_KEYS);
     ResultSet rs = sql.getGeneratedKeys();
     if (rs.next()) {
      return rs.getBigDecimal(1).longValue();
     } else {
      throw new Exception("Trade Order Insert Failed");
     }
   } finally {
     if (dbConnection != null) dbConnection.close();
   }
  }
}

清单 1 中的 JDBC 代码没有包含任何事务逻辑,它只是在数据库中保存 TRADE 表中的交易订单。在 本例中,数据库处理事务逻辑。

在 LUW 中,这是一个不错的单个数据库维护操作。但是如果需要在向数据库插入交易订单的同时更新 帐户余款呢?如清单 2 所示:

清单 2. 在同一方法中执行多次表更新

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

事务策略: 了解事务陷阱-在Java平台中实现事务时要注意的常见错误(3)

时间:2011-10-21 IBM Mark Richards

在本例中,insertTrade() 和 updateAcct() 方法使用不带事务的标准 JDBC 代码。insertTrade() 方法结束后,数据库保存(并提交了)交易订单。如果 updateAcct() 方法由于任意原因失败,交易订单 仍然会在 placeTrade() 方法结束时保存在 TRADE 表内,这会导致数据库出现不一致的数据。如果 placeTrade() 方法使用了事务,这两个活动都会包含在一个 LUW 中,如果帐户更新失败,交易订单就会 回滚。

随着 Java 持久性框架的不断普及,如 Hibernate、TopLink 和 Java 持久性 API(Java Persistence API,JPA),我们很少再会去编写简单的 JDBC 代码。更常见的情况是,我们使用更新的对 象关系映射(ORM)框架来减轻工作,即用几个简单的方法调用替换所有麻烦的 JDBC 代码。例如,要插 入 清单 1 中 JDBC 代码示例的交易订单,使用带有 JPA 的 Spring Framework,就可以将 TradeData 对象映射到 TRADE 表,

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