快速业务通道

Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
持方法调用)。

从本质上来说,事务的作用域划定到流中的 <evaluate> 标签。应用 @Transactional(readyOnly=false) 将使 JPA/Hibernate FlushMode 设置为 AUTO,这样 Hibernate 会确定在同一事务的上下文内何时刷新数据变更。为了简化编程和优化 SQL,在这些用例中使用自动刷新要优于手动刷新。注意在同一 <transition> 下允许多个 <evaluate> 标签,会导致每用户操作出现多个数据库事务。

如果每个用户操作/请求被认为是原子性的,通常事实也是如此,我们希望将所有数据库写操作分组到一个 Spring bean 的一个 @Transactional 方法内,这样它们就绑定了同样的事务上下文并通过同样的 <evaluate> 标签调用。清单 1 展示了我们如何指定原子请求的事务上下文。

清单 1. 指定原子用户操作的事务上下文

<transition>   <evaluate expression="beanA.readAlpha()"/>   <evaluate expression="beanA.readBeta()"/>   <evaluate expression="beanB.readGamma()"/>   <evaluate expression="beanA.writeAll()"/> <!-- a single read/write transaction -->   <evaluate expression="beanB.readEta()"/> </transition>

清单 2 展示了一个非典型的案例,其中同一个用户请求中涉及了多个读/写事务(独自提交或回滚)。因此,用户请求变成了非原子的,这在大部分开发场景中是灾难性的。

清单 2. 为非原子用户操作指定事务上下文

<transition>   <evaluate expression="beanA.readAlpha()"/>   <evaluate expression="beanA.readBeta()"/>   <evaluate expression="beanB.readGamma()"/>   <evaluate expression="beanA.writeDelta()"/> <!-- read/write transaction -->   <evaluate expression="beanA.writeEpsilon()"/> <!-- read/write transaction -->   <evaluate expression="beanB.writeZeta()"/> <!-- read/write transaction -->   <evaluate expression="beanB.readEta()"/> </transition>

我们如何处理那些同一 <transition> 下的其他 <evaluate> 标签引用的只读操作?我们有三个选择:

如前所述,不带有任何数据库事务地运行只读操作。

将其标记为 @Transactional(readOnly=false),这样可以在读/写数据库事务下执行 SQL 查询。在这种情况下,流作用域持久化上下文的 FlushMode 将一直是 AUTO。

用 @Transactional(readOnly=true) 标记它们。这样,对于那些只读事务 FlushMode 变成 MANUAL 而在遇到读/写事务时又会过渡到 AUTO。

在持久化上下文中,JPA/Hibernate 会在提交读/写事务前自动刷新未决变更。为了简单,Hibernate 团队鼓励开发人员在此类情况下,在所有数据操作中都一致地应用读/写事务。只需向所有应用 @Transactional 的地方设置 readOnly=false 即可。

Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略(6)

时间:2012-02-26 IBM Xinyu Liu

每请求一个事务的情况如何?

您可能会问为什么不用一个大事务封装每个用户请求。问题是请求级别的事务会使相关的数据库锁保持打开状态,直到完成视图呈现。不幸地是,视图呈现涉及阻止 I/O 操作,这可能会很慢而影响底层数据库的性能和可伸缩性。

意料之外的 OptimisticLockingFailureException 异常

在非原子 Web 流中使用流作用域的持久化上下文,您可能会遇到一些意料之外的 OptimisticLockingFailure

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