Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略 - 编程入门网
持方法调用)。
从本质上来说,事务的作用域划定到流中的 <evaluate> 标签。应用 @Transactional(readyOnly=false) 将使 JPA/Hibernate FlushMode 设置为 AUTO,这样 Hibernate 会确定在同一事务的上下文内何时刷新数据变更。为了简化编程和优化 SQL,在这些用例中使用自动刷新要优于手动刷新。注意在同一 <transition> 下允许多个 <evaluate> 标签,会导致每用户操作出现多个数据库事务。 如果每个用户操作/请求被认为是原子性的,通常事实也是如此,我们希望将所有数据库写操作分组到一个 Spring bean 的一个 @Transactional 方法内,这样它们就绑定了同样的事务上下文并通过同样的 <evaluate> 标签调用。清单 1 展示了我们如何指定原子请求的事务上下文。 清单 1. 指定原子用户操作的事务上下文
清单 2 展示了一个非典型的案例,其中同一个用户请求中涉及了多个读/写事务(独自提交或回滚)。因此,用户请求变成了非原子的,这在大部分开发场景中是灾难性的。 清单 2. 为非原子用户操作指定事务上下文
我们如何处理那些同一 <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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |