我正在尝试使用命令模式来允许我的Web层在单个事务的上下文中使用Hibernate实体(从而避免延迟加载异常)。但是,我现在对如何处理交易感到困惑。
我的命令调用带有@Transactional
注释的服务层方法。这些服务层方法中的某些方法是只读的,例如@Transactional(readOnly=true)-
,而某些方法是读/写的。
我的服务层公开了一个命令处理程序,该命令处理程序代表Web层执行传递给它的命令。
@Transactional
public Command handle( Command cmd ) throws CommandException
我认为我对使命令处理程序的handle()
方法具有事务性是正确的。这就是造成混乱的地方。如果命令的实现调用了多个服务层方法,则命令处理程序将无法知道命令内调用的操作是只读,读/写还是组合操作在两个中。
我不了解此示例中的传播方式。如果我要创建该handle()
方法readOnly=true
,那么如果该命令随后调用带有注释的服务层方法,会发生什么情况@Transactional(realOnly=false)
?
非常感谢你对此有所了解,并欢迎你提出意见。
首先,由于Spring本身并不执行持久性,因此无法指定readOnly
确切含义。该属性仅是提供者的提示,其行为取决于(在这种情况下)Hibernate。
如果指定readOnly
为true
,则刷新模式将设置为FlushMode.NEVER
当前的Hibernate Session
中的状态,以防止会话提交事务。
此外,将在JDBC连接上调用setReadOnly(true),这也是对基础数据库的提示。如果你的数据库支持它(很可能会这样做),则其效果与基本上相同FlushMode.NEVER
,但是它更强大,因为你甚至无法手动刷新。
现在,让我们看看事务传播是如何工作的。
如果未明确设置readOnly
为true
,则将具有读/写事务。根据事务属性(如REQUIRES_NEW),有时你的事务在某个时候被挂起,新的事务开始并最终提交,然后恢复第一笔事务。
好,我们快到了。让我们看看导致readOnly
这种情况的原因。
如果读/写事务中的方法调用需要readOnly
事务的方法,则应暂停第一个方法,因为否则将在第二个方法的末尾进行刷新/提交。
相反,如果再次从需要read / write的readOnly事务中调用方法,则第一个方法将被挂起,因为它无法刷新/提交,而第二个方法则需要该方法。
在readOnly-to-readOnly和读/写到读/写的情况下,不需要暂停外部事务(除非你另外指定传播,否则显然)。
问题内容: 我在课堂上使用哪种方法,我想知道如何在特定的服务方法上使用只读。 我是否需要额外的定义与此服务的方法,或有另一种方式? 问题答案: 从Spring API 这里。 在评估方法的事务设置时,最派生的位置优先。 在下面的示例中,DefaultFooService类在类级别使用只读事务的设置进行注释,但是同一类中updateFoo(Foo)方法上的@Transactional注释优先于定义的
问题内容: 有人可以通过实际示例解释注释中的隔离和传播参数吗? 基本上,何时和为什么我应该选择更改其默认值。 问题答案: 好的问题,尽管不是一个简单的答案。 Propagation 定义事务之间的关系。常用选项: :代码将始终在事务中运行。创建一个新事务或重用一个事务(如果有)。 :代码将始终在新事务中运行。如果存在当前事务,则将其挂起。 Isolation 定义事务之间的数据契约。 :允许脏读。
问题内容: 以下是我的申请流程 控制器-服务-存储库 在服务层,我们具有注释。我们还具有配置,在其中指定实体管理器和txn管理器。 我的怀疑是我认为考虑了在其中指定的txn管理器,并且在服务层进行指定没有影响。例如:服务层可以映射到自定义的txn管理器,其中服务调用的存储库可能具有不同的txn管理器。在那种情况下会不会造成问题? 有人可以澄清一下,在使用jpa存储库时是否需要将其放置在服务层上?
问题内容: 我在Web应用程序中使用 Spring 3.1 + Hibernate4.x 。在我的DAO中,我将用户类型对象保存如下 但是出现以下异常: 我用谷歌搜索并找到了类似的问题,有以下解决方案: 那解决了问题。但是在该解决方案中,手动开始和提交事务有很多麻烦。 没有手动开始/提交交易,我不能直接使用 吗? 我也尝试在服务/ dao方法上使用,但是问题仍然存在。 编辑: 这是我的Spring
但获得以下异常: 我搜索了一下,在SO上找到了类似的问题,解决方法如下: 这就解决了问题。但在该解决方案中,手动开始和提交事务会有很多麻烦。 请帮帮忙。
我之前有一个关于这个问题的帖子已经解决了。然而,自从用自动连线bean和较少的XML配置重建项目后,我发现我正在重新考虑这个问题。我遵循了我以前的项目实现这一点的方式,但它不起作用。有人能帮助我为什么或者我应该改变什么来使它工作吗? 注册服务: 注册DAO: