spring - 关于Grails服务的一些问题

标签 spring grails service transactions transactional

我正在使用 Grails Web 应用程序,并且在使用 Grails 服务时遇到了很多奇怪的事情。所以我想问一些关于这个的问题,让我更多地了解Grails服务。这对我(也许对其他人也很有帮助^_^)。提前致谢。

  1. 如果服务配置为 static transactional = true,那么在使用脏对象并在 Hibernate session 中锁定的任何方法调用后,它是否会将每个数据更改刷新到数据库?

  2. 我可以在类级别使用 @Transactional 注释而不是 static transactional = true 吗?是否可以将 @Transactional(readOnly = true) 放在一些我只想让它们从数据库读取(查询、查找)数据的方法中?

  3. 事务继承怎么样?我的意思是,如果父服务配置为static transactional = true,并且子服务有自己的@Transactional注释(在类上)和一些@Transactional (readOnly = true) (在某些方法上),如果我从子方法调用父方法,会发生什么情况?

  4. 事务是否可以与抽象服务一起使用?因为据我所知,使用抽象服务我们无法初始化它的 bean,并且也许在启动应用程序时,Grails 上下文存在一些差异。

最佳答案

每个问题你应该问一个问题:)

对于问题#1,是的 - Spring/Hibernate 集成确保刷新发生在提交之前。因此,对 save()delete() 的调用将被刷新,并且无需向其中添加 flush: true 。此外,除非您调用 discard(),否则您未调用 save() 的脏实例也将被刷新。

对于#2:默认情况下,服务是事务性的,因此 transactional = true 实际上是多余的 - 您只需将其指定为 transactional = false。但是,只有在没有 @Transactional 注释的情况下,才会创建自动事务包装器。如果您有一个或多个注释,那么它们将定义事务划分。因此,默认情况下(即没有注释并且没有 transactional 属性或 transactional = true),所有方法都是事务性的,但如果您只注释方法的子集,那么只有那些方法会具有事务性。

通常,当您需要非默认行为时,即自定义传播、隔离、超时等(或像示例中那样将其设置为只读),您会使用注释。

您可以在类级别进行注释,以使所有方法具有相同的配置,并且可以选择注释单个方法以覆盖类范围默认值。

对于#3 和#4,适用标准规则(请参阅#2)。如果子类有注释,那么来自该类或父类的 transactional = true 将被忽略,因为通过使用注释,您已经告诉 Grails 您正在自己配置事物。

由于抽象服务无法实例化,因此实际实例化的具体子类将结合基类和自身的行为。如果一切都是transactional = true,那么事情就很简单,如果您有任何注释,那么它们就定义了规则。

调用父类(super class)中的方法就像调用当前类中的方法一样。但如果您没有考虑 Spring 代理方法的含义,这种行为就有点违反直觉。当您调用事务方法时,代理会拦截该调用并加入事件事务,或者根据需要启动一个新事务,或者如果指定了 REQUIRES_NEW,则启动一个新事务。但是,一旦您进入真正的类并调用另一个方法,您将绕过代理。因此,如果您调用具有不同注释设置的另一个方法,它们将被忽略。如果您打算这样做,请参阅此邮件列表讨论以了解正在发生的情况以及如何使用它:http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html

关于spring - 关于Grails服务的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351520/

相关文章:

java - Spring 与 ftp 跳过文件集成

java - 使用 Autowire 检索具有范围原型(prototype)的 bean

Grails GSP 编译?

grails - 如何从Grails调用Solr中存在的Rest Api?

grails - Splunk应用程序(地理位置定位脚本(由MAXMIND提供支持))和Splunk SDK不同结果

Android 重启广播接收器后未运行

java - Mockito 空指针异常

java - Spring MVC 3 网址初学者

android - 从 Intent 检索 Extras 时出现 NullPointerException

c# - Windows 服务 Facebook C# SDK 架构