2011-05-13 26 views
3

升級我的項目我在這裏想着關於交易。那麼,我不太確定何時應該在Spring中使用我的Hibernate查詢事務。不是我完全不明白交易是什麼,我想我可以,但是我需要使用get*類型查詢的交易,只需設置read-only屬性?何時在Spring中使用Hibernate進行事務?

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <!-- all methods starting with 'get' are read-only --> 
     <tx:method name="get*" read-only="true" /> 
     <!-- other methods use the default transaction settings --> 
     <tx:method name="*" /> 
    </tx:attributes> 
</tx:advice> 

對於get*查詢是否有效?因爲,據我所知,使用事務應該像更新,插入,刪除和這樣的查詢一樣完成。我在這裏錯過了什麼嗎?

回答

5

使用事務處理在一定程度上取決於需求。

顯然,在UPDATE和DELETE操作上使用事務是有道理的。例如,如果您需要鎖定記錄,以使另一個線程/請求不會更改讀取,則在SELECT語句上使用事務也會很有用。這通常是業務需求。

在我們公司,我們將所有的語句(即SELECT,UPDATE,DELETE)包含在一個事務中。

此外,除了數據級別之外,事務管理實際上更適合於另一層。一般來說,交易將符合業務需求。例如,如果要求將資金存入一個賬戶,那麼應該使用一些更高級的類/代碼來將整個方法標記爲交易方式,因爲該方法需要作爲一個單元來完成(因爲可能有多個數據庫調用)。

春天對事務管理有很多話要說。

+0

我通常也包含訪問事務中的數據庫的每個業務操作。最近我想知道這是否會導致任何可能減慢應用程序的開銷。在這種情況下,使用僅用於創建,刪除和更新的事務是否合理? – Giorgio 2012-03-04 18:30:18

+0

我們公司要求我們在每次交易之後提交,甚至包括SELECT語句。我當然可以看到只包裝UPDATE語句的位置會產生更少的開銷。 – tjg184 2012-03-05 13:18:20

1

This似乎是一個相當不錯的答案,爲什麼你應該。但是,this給出了一些原因。基本上,如果您的修改未完成,您希望在數據最終處於不良狀態時使用它們。

1

一個很好的規則是在DAO之上的應用程序級別管理事務。這樣,如果你有一個數據訪問操作A,有時需要在自己的事務中執行,有時候應該加入現有的事務,那麼你就不必跳過這個循環。將此方法與通過AOP管理事務(以及Hibernate會話)結合起來,讓您的代碼變得更易於理解和維護。

0

要獲得關於干將具體問題:如果您使用的是AOP交易與readOnly的真實,你正確設置你的JPA方言冬眠

,春天就會把你的Hibernate Session到無沖洗模式。通過消除不必要的骯髒檢查,可以爲大批量操作提高性能。所以在這方面值得。

相關問題