簡體   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