科技时代新浪首页 > 科技时代 > 软件 > 正文

在Spring中集成Hibernate事务管理(5)


http://www.sina.com.cn 2005年08月19日 11:53 天极yesky

  文/陶刚编译

  下一步,也是最重要的,示例显示订单和订单项保存在appfuse1数据库中,而审计对象保存在appfuse2数据库中。实际上,OrderListManager中的服务方法与多个数据库交互。用下面的命令打开appfuse2数据库可以看到审计轨迹,如图8所示:
CATALINA_HOME\bin\ant browse2

在Spring中集成Hibernate事务管理(5)
图8:appfuse2数据库中建立的审计轨迹,包含了失败的TX条目

  图8中的最后一行需要特别注意。RESOURCE数据列表明"它与LineItem5对应"。但是如果我们回头看图7会发现,没有与LineItem5对应的订单项。这儿出错了吗?实际上,没有出现任何错误,图8中这额外的一行也是本文全部内容所解释的部分。我们现在讨论发生了什么情况。
我们知道addLineItem()拥有PROPAGATION_REQUIRED,log()方法拥有PROPAGATION_REQUIRES_NEW。此外,addLineItem()内部调用了log()方法。因此,当我们试图给Order2添加第三个订单项的时候,就引发了异常(根据业务规则),它将回滚这个订单项的建立和链接操作。但是,由于log()也是在addLineItem()中调用的,并且由于log()拥有PROPAGATION_REQUIRES_NEW TX属性,addLineItem()的回滚并不会回滚log(),因为log()在新TX中发生。

  我们现在对log()的TX属性做一些修改。我们不使用PROPAGATION_REQUIRES_NEW,而是把它改变为PROPAGATION_SUPPORTS。PROPAGATION_SUPPORTS属性允许服务方法在客户端TX中运行(如果该客户端拥有TX上下文关系),否则该方法会不带TX运行。你可能需要重新安装应用程序,这样数据库中已有的数据就可以被清除了。如果要重新安装,请查看前面部分中的第12步。

  如果我们重新运行,我们将体验到稍微的不同。这次,当我们试图给Order 2添加第三个订单项的时候也碰到了异常。它会回滚(试图添加第三个订单项的)事务。接着这个方法调用了log()方法。但是,由于log()方法的TX属性为PROPAGATION_SUPPORTS,log()将会在与addLineItem()方法相同的TX上下文关系中被调用。由于addLineItem()回滚了,log()也回滚了,导致没有回滚TX的审计记录。因此在图9中没有审计轨迹条目与失败的TX对应!
在Spring中集成Hibernate事务管理(5)
图9:appfuse2数据库中的审计轨迹,没有与失败的TX对应的条目

  造成这种不同的事务行为的唯一的修改是我们改变了Spring配置中的TX属性,如下所示:

<bean id="auditManager"
class="org.springframework.transaction.
interceptor.TransactionProxyFactoryBean">
<property name="transactionAttributes">
<props>
<!-- prop key="log">
PROPAGATION_REQUIRES_NEW
</prop -->
<prop key="log">
PROPAGATION_SUPPORTS
</prop>

</props>
</property>
</bean>

  这就是宣告式事务管理的效果,自从EJB开始的时候,我们就讨论它了。但是,我们知道自己需要高端的应用程序服务器来寄宿EJB组件。现在我们知道即使没有EJB服务器,使用Spring,我们也可以看到类似的结果。

  总结

  本文为J2EE世界中的两个强者:Spring和Hibernate之间的结合提供了一条光明大道。通过提升两者的能力,我们拥有了用于容器管理的持久性(CMP)、容器管理的关系(CMR)和宣告式事务管理的替代技术。即使Spring并非设计为替代EJB的,但是它提供的特性,例如无格式java对象的宣告式事务管理,也使用户在很多项目中可以省去EJB。

  找到EJB的替代物并非本文的目标,但是我们试图找到解决手头问题的最可行的技术方案。因此,我们需要进一步研究Spring和Hibernate这个轻量级组合的能力,这也是读者未来需要探究的主题。

[上一页] [1] [2] [3] [4] [5]


  爱问(iAsk.com)


评论】【应用软件】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5828   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2005 SINA Inc. All Rights Reserved

版权所有 新浪网