当前位置: 首页 > 面试题库 >

grails中的withTransaction和withSession有什么区别?

巫马瀚漠
2023-03-14
问题内容

我知道一个获取基础会话,另一个获取对当前交易状态的引用;但是,它们之间有什么区别,每个示例用例将是什么?

我的要求是在Service方法块中批量保存一些记录。


问题答案:

withTransaction有点骇人听闻,因为它允许您在任何地方进行事务处理工作,但是最好将您的疑虑分开并在事务处理服务中进行工作。默认情况下,服务是事务性的,除非您添加了该服务,static transactional = false并且可以使用@Transactional注释在类和/或方法级别对其进行微调。您只需将代码放入服务方法中而不使用withTransaction或就可以了withSession

withSession是访问当前Hibernate
Session(通常由OpenSessionInView拦截器注册的一种)的一种便捷方法。如果您想清除会话或执行GORM未公开的其他工作,则可以通过这种方式访问​​它,而无需访问sessionFactorySpring使用的或线程本地持有人。

withTransaction在事务服务方法之外,一种有效的用法是在Session控制器请求之外(即,当没有自动创建时Session)绑定Hibernate
withTransaction将启动一个事务并创建一个Session需要的事务,并在关闭期间保持打开状态。因此,您可以使用它来避免延迟加载异常。对于那些仅从数据库中读取而无需事务性写入的情况,我们需要另一种方法来实现此目的而无需事务处理开销。但是目前,这种方法行之有效。但是,如果您执行数据库写操作,请将代码移至服务方法。



 类似资料:
  • 首先是一些背景知识:我正在使用Spring Security的修改版本来执行Active Directory身份验证,并检查存储在数据库中的可能访问权限。这意味着在普通的Groovy类中有一个调用来从数据库中加载信息: 这在Hibernate 4.3.6.1和Tomcat 7.0.54上效果很好,但是,在升级(升级到4.3.10.18和8.0.14.1)后,它现在在调用动态查找器方法时会产生“Hi

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: JavaScript中的&和&&有什么区别? 示例代码: 似乎&&是一个逻辑上的“和”,如果两个都为true,则总是为我提供第二个值。 但是什么是&? (顺便说一下,&&在Python中似乎是“ and”;&在Python中似乎是&。) 问题答案: 是按位AND 该运算符期望 两个数字 并重新调整一个 数字。 如果它们不是数字,则将其强制转换为数字。 注意: 在Javascript中,

  • 问题内容: 我正在从Spring 2.5迁移到Spring 3。 他们介绍了一些黑魔法。预期仅在servlet配置文件中声明。 在Spring 2.5中,我刚刚使用,并且在分发服务器servlet配置XML中声明了标记,并使用了要扫描的基本包。 所以,我不知道是什么样的区别,并在servlet配置标签和我有什么可以消除在Spring3配置文件? 问题答案: 声明一般注释,比如支持,等等。 声明了注

  • 问题内容: 我是Go编程语言的新手。 我注意到Go中有一些奇怪的地方:我认为它在Python中使用并替代了,但是当我在Go中使用时,它也是可行的。 和之间有什么区别? 问题答案: 是分配。有关Go中分配的更多信息:分配 和在变量声明中使用时的细微差别。 Go中变量声明的一般形式是: 上面的声明创建一个特定类型的变量,为其添加名称,并设置其初始值。 无论是或可以省略,但不能同时使用。 例如: 被称为

  • 问题内容: 。*是零个或多个次数的任何字符。我试图找到以元音开头的单词,我用过 它给了我所有以元音开头的单词。当我这样做时,也会得到相同的结果。 现在,我正在寻找以元音结尾的单词。我做了 它没有给出任何结果,但是当我这样做时却给出了有效的结果。请解释两者含义上的差异。谢谢 问题答案: 看起来,在Oracle11中,和模式(之前没有任何内容)会生成零宽度的匹配项。所以与被捕获组包含零宽度的图案或分别