繁体   English   中英

grails中withTransaction和withSession有什么区别?

[英]What is the difference between withTransaction and withSession in grails?

我知道一个获取底层会话而另一个获取当前事务状态的引用; 但是,它们之间的区别是什么?每个用例的用例是什么?

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

withTransaction有点hackish因为它允许你在任何地方进行交易工作,但最好将你的顾虑分开并在交易服务中完成工作。 默认情况下,服务是事务性的,除非您添加static transactional = false并且可以使用@Transactional注释在类和/或方法级别进行微调。 您可以将代码放在服务方法中而不使用withTransactionwithSession

withSession是一种访问当前Hibernate Session (通常是OpenSessionInView拦截器注册的Session )的便捷方式。 如果你想清除会话,或做其他未被GORM公开的工作,这是一种访问它而无需访问sessionFactory或Spring使用的线程本地持有者的方法。

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

SessionTransactionStatus是两个完全不同的东西。 Session是一个抽象,使您可以访问所有hibernate功能,而TransactionStatus可用于控制当前事务。

如果需要直接访问hibernate函数,可以使用withSession 如果要使用Grails / GORM不直接支持的休眠功能,这可能很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM