小编典典

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

hibernate

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

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


阅读 413

收藏
2020-06-20

共1个答案

小编典典

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

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

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

2020-06-20