grails中withTransaction和withSession有什么区别?

Tho*_*our 14 session grails hibernate transactions grails-orm

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

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

Bur*_*ith 23

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

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

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

  • 除非你真的处于异常状态,否则你几乎从不想要回滚一个有异常的交易.使用未经检查的异常来回滚事务的典型反模式利用了副作用,并且由于异常的成本而效率低,在使用Groovy时更是如此.但是`withTransaction`是_not_唯一正确的方法.只需使用`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()` (4认同)