我們項目一期已經差不多結束了,所以一些細節也被拿了出來,出現最多的就是事務的操作了。因為自己負責的是一個模塊(因為是另外一個項目的負責人),所以組員經常會遇到事務的問題,會出現很多奇葩的用法,各種亂用,估計他們就知道在方法上面注解@Transactional,但是其中的很多細節都不知道。所以經常會出現一個情況,就是一大坨代碼出現了事務的問題,然後我就去各種改。所以今天也對事務做一個總結吧。以後忘記了可以回來看看。
一般我們使用事務最主要注重的是三個方面:
1.propagation:傳播性
2:isolation:事務的隔離級別
3:readOnly是否只讀
其中在單獨使用不帶任何參數的 @Transactional 注釋時,傳播模式要設置為 REQUIRED,只讀標志設置為 false,事務隔離級別設置為 READ_COMMITTED,而且事務不會針對受控異常(checked exception)回滾。
傳播性:
* 3.propagation:傳播性
* <br>Propagation取值:
REQUIRED(默認值):在有transaction狀態下執行;如當前沒有transaction,則創建新的transaction;
SUPPORTS:如當前有transaction,則在transaction狀態下執行;如果當前沒有transaction,在無transaction狀態下執行;
MANDATORY:必須在有transaction狀態下執行,如果當前沒有transaction,則拋出異常IllegalTransactionStateException;
REQUIRES_NEW:創建新的transaction並執行;如果當前已有transaction,則將當前transaction掛起;
NOT_SUPPORTED:在無transaction狀態下執行;如果當前已有transaction,則將當前transaction掛起;
NEVER:在無transaction狀態下執行;如果當前已有transaction,則拋出異常IllegalTransactionStateException
PROPAGATION_NESTED(嵌入式事務):通過創建Savepoint實現嵌套事務,達到內層事務若拋出異常(unchecked exception)則回滾到savepoint處,但不影響外層事務;外層事務的回滾會一起回滾內層事務;
(對於spring-jdbc和mybatis有用 但是對於hibernate的sessionFactory是沒有有用的)
隔離級別
* 1.isolation:事務的隔離級別
* spring的事務隔離級別
ISOLATION_DEFAULT:使用數據庫默認的隔離級別。 spring中默認是READ_COMMITTED
ISOLATION_READ_UNCOMMITTED:允許讀取改變了的還未提交的數據,可能導致髒讀、不可重復讀和幻讀。
ISOLATION_READ_COMMITTED:允許並發事務提交之後讀取,可以避免髒讀,可能導致重復讀和幻讀。
ISOLATION_REPEATABLE_READ:對相同字段的多次讀取結果一致,可導致幻讀。
ISOLATION_SERIALIZABLE:完全服從ACID的原則,確保不發生髒讀、不可重復讀和幻讀。
是否只讀:
6.readOnly是否只讀 默認不是只讀(false) 如果沒有事務的時候 那麼這個設置會被忽略
1.其中我們需要注意的地方是,我們在使用orm框架的時候,是需要使用事務來觸發sql的執行的。所以在我們使用orm框架中都會使用事務。而且很重要的是在hibernate典型的no session錯誤也有一大大部分問題是出在沒有添加事務。
2.第二個注意點就是說如果我們選擇的策略中沒有事務,那麼設置了是否只讀屬性沒有任何的作用的。
3.其他幾個屬性的作用:
timeout事務的響應時間 ,如果超過時間 那麼就會出現錯誤。單位是秒
noRollbackFor:指定異常類不會回滾,在默認的情況下 事務回滾只對於RuntimeException的異常有用(只對非checked的異常回滾)
noRollbackForClassName:和上面是相同的意思 但是這裡是指定異常的名稱
value名稱
Spring中如何配置Hibernate事務 http://www.linuxidc.com/Linux/2013-12/93681.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
基於 Spring 設計並實現 RESTful Web Services http://www.linuxidc.com/Linux/2013-10/91974.htm
Spring-3.2.4 + Quartz-2.2.0集成實例 http://www.linuxidc.com/Linux/2013-10/91524.htm
使用 Spring 進行單元測試 http://www.linuxidc.com/Linux/2013-09/89913.htm
運用Spring注解實現Netty服務器端UDP應用程序 http://www.linuxidc.com/Linux/2013-09/89780.htm
Spring 3.x 企業應用開發實戰 PDF完整高清掃描版+源代碼 http://www.linuxidc.com/Linux/2013-10/91357.htm
Spring 的詳細介紹:請點這裡
Spring 的下載地址:請點這裡