2012-04-25 225 views

回答

4

我認爲@Transaction(readOnly = true)正確的做法。這不會創建新的/額外的物理事務,因此不應該有任何開銷來使用它。它將使用已經爲請求設置的事務。每個Hibernate文檔:

...實際上,每個SQL語句,無論是查詢還是DML,都必須在數據庫事務中執行。在數據庫事務之外不能與數據庫進行通信。 (請注意,有這樣的事情只讀事務,可以用來改善清理時間在數據庫引擎如果沒有足夠的智慧來優化自己的業務。)

https://community.jboss.org/wiki/SessionsAndTransactions#Transactions

1

有如果沒有與數據庫的交易(沒錯,但是驅動程序支持NO_TRANSACTION模式,例如DB2驅動程序是一種罕見的情況),您無法工作。此外,驅動程序和數據庫可能不支持只讀事務(如Oracle)。所以即使底層連接設置爲只讀模式,這並不意味着它會起作用。

在這種情況下唯一確定只讀標誌的是它將Hibernate的flush模式設置爲MANUAL。這意味着Hibernate不會與數據庫同步,除非發出對Session#flush()的顯式調用。所以在交易結束時不會發生髒檢查和插入/更新/選擇。

有關交易管理的更多精確信息,您可以查看org.springframework.orm.hibernate3.HibernateTransactionManager#doBegin()方法。

相關問題