快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
并用清单 3 中的 JPA 代码替换所有 JDBC 代码:

清单 3. 使用 JPA 的简单插入

public class TradingServiceImpl {
  @PersistenceContext(unitName="trading") EntityManager em;
  public long insertTrade(TradeData trade) throws Exception {
    em.persist(trade);
    return trade.getTradeId();
  }
}

注意,清单 3 在 EntityManager 上调用了 persist() 方法来插入交易订单。很简单,是吧?其实不 然。这段代码不会像预期那样向 TRADE 表插入交易订单,也不会抛出异常。它只是返回一个值 0 作为交 易订单的键,而不会更改数据库。这是事务处理的主要陷阱之一:基于 ORM 的框架需要一个事务来触发 对象缓存与数据库之间的同步。这通过一个事务提交完成,其中会生成 SQL 代码,数据库会执行需要的 操作(即插入、更新、删除)。没有事务,就不会触发 ORM 去生成 SQL 代码和保存更改,因此只会终止 方法 — 没有异常,没有更新。如果使用基于 ORM 的框架,就必须利用事务。您不再依赖数据库来管理 连接和提交工作。

这些简单的示例应该清楚地说明,为了维护数据完整性和一致性,必须使用事务。不过对于在 Java 平台中实现事务的复杂性和陷阱而言,这些示例只是涉及了冰山一角。

Spring Framework @Transactional 注释陷阱

您将测试 清单 3 中的代码,发现 persist() 方法在没有事务的情况下不能工作。因此,您通过简单 的网络搜索查看几个链接,发现如果使用 Spring Framework,就需要使用 @Transactional 注释。于是 您在代码中添加该注释,如清单 4 所示:

清单 4. 使用 @Transactional 注释

public class TradingServiceImpl {
  @PersistenceContext(unitName="trading") EntityManager em;
  @Transactional
  public long insertTrade(TradeData trade) throws Exception {
   em.persist(trade);
   return trade.getTradeId();
  }
}

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

时间:2011-10-21 IBM Mark Richards

现在重新测试代码,您发现上述方法仍然不能工作。问题在于您必须告诉 Spring Framework,您正在 对事务管理应用注释。除非您进行充分的单元测试,否则有时候很难发现这个陷阱。这通常只会导致开发 人员在 Spring 配置文件中简单地添加事务逻辑,而不会使用注释。

要在 Spring 中使用 @Transactional 注释,必须在 Spring 配置文件中添加以下代码行:

<tx:annotation-driven transaction-manager="transactionManager"/>

transaction-manager 属性保存一个对在 Spring 配置文件中定义的事务管理器 bean 的引用。这段 代码告诉 Spring 在应用事务拦截器时使用 @Transaction 注释。如果没有它,就会忽略 @Transactional 注释,导致代码不会使用任何事务。

让基本的 @Transactional 注释在 清单 4 的代码中工作仅仅是开始。注意,清单 4 使用 @Transactional 注释时没有指定任何额外的注释参数。我发现许多开发人员在使用 @Transactional 注 释时并没有花时间理解它的作用。例如,像我一样在清单 4 中单独使用 @Transactional 注释时,事务 传播模式被设置成什么呢?只读标志被设置成什么呢?事务隔离级别的设置是怎样的?更重要的是,事务 应何时回滚工作?理解如何使用这个注释对于确保在应用程序中获得合适的事务支持级别非常重要。回答 我刚才提出的问题:在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED ,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚

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