要使事務註解有效,首先需要在spring配置檔案中加入如下**:
同時,必須引入tx 網域名稱。
@transactional的應用:
加在service層或者dao層類名之上,或者是public方法上,表示該方法使用了事務, 對於其它非public的方法,如果標記了@transactional也不會報錯,但方法沒有事務功能.
spring使用宣告式事務處理,預設情況下,如果被註解的資料庫操作方法中發生了unchecked異常,所有的資料庫操作將rollback;如果發生的異常是checked異常,預設情況下資料庫操作還是會提交的。
這種預設的行為是可以改變的。
使用@transactional註解的norollbackfor和rollbackfor屬性
如:@transactional(rollbackfor=exception.class)可以使checked異常發生時,資料庫操作也rollback、@transactional(norollbackfor=runtimeexception.class)可以使unchecked異常發生時也提交資料庫操作。
也可以使用norollbackforclassname、rollbackforclassname屬性來指定乙個異常類名的string陣列來改變預設的行為。
讀取資料庫中的資料時是不需要事務管理的,這種情況下可以使用事務的傳播行為來告訴spring不需要開啟事務,
如:@transactional(propagation = propagation.not_supported)。
事務的傳播行為有:
1. required:表示業務方法需要在乙個事務中處理,如果業務方法執行時已經在乙個事務中,則加入該事務,否則重新開啟乙個事務。這也是預設的事務傳播行為;
2. not_supported:宣告業務方法不需要事務,如果業務方法執行時已經在乙個事務中,則事務被掛起,等方法執行完畢後,事務恢復進行;
3. requires_new:表明業務方法需要在乙個單獨的事務中進行,如果業務方法進行時已經在乙個事務中,則這個事務被掛起,並重新開啟乙個事務來執行這個業務方法,業務方法執行完畢後,原來的事務恢復進行;
4. mandatory:該屬性指定業務方法只能在乙個已經存在的事務中進行,業務方法不能發起自己的事務;如果業務方法沒有在乙個既有的事務中進行,容器將丟擲異常;
5. supports:該屬性指定,如果業務方法在乙個既有的事務中進行,則加入該事務;否則,業務方法將在乙個沒有事務的環境下進行;
6. never:指定業務方法不可以在事務中進行,如果業務方法執行時已經在乙個事務中,容器將丟擲異常;
7. nested:該屬性指定,如果業務方法在乙個既有的事務中執行,則該業務方法將在乙個巢狀的事務中進行;否則,按照requeired來對待。它使用乙個單獨的事務,這個事務可以有多個rollback點,內部事務的rollback對外部事務沒有影響,但外部事務的rollback會導致內部事務的rollback。這個行為只對datasourcetransactionmanager有效。
事務的隔離級別
使用@transactional的isolation屬性可以指定事務的隔離級別。但事務的隔離級別是由底層的資料庫實現的,並不是由spring來實現。
1. read_uncommitted:會出現髒讀、不可重複讀和幻讀問題;
2. read_committed:會出現不可重複讀和幻讀問題;
3. repeatable_read:會出現幻讀問題;
4. serializable:序列化,不會出現上面的問題。
一般的資料庫預設提供的是read_committed隔離級別,如sqlserver2000;mysql預設提供的是repeatable_read。
@transactional 的所有可選屬性如下:
屬性 型別 預設值 說明
propagation propagation列舉 required 事務傳播屬性
isolation isolation列舉 default 事務隔離級別
readonly boolean false 是否唯讀
timeout int -1 超時(秒)
rollbackfor class {} 需要回滾的異常類
rollbackforclassname string {} 需要回滾的異常類名
norollbackfor class {} 不需要回滾的異常類
norollbackforclassname string {} 不需要回滾的異常類名
//事務傳播屬性
@transactional(propagation=propagation.required) //如果有事務,那麼加入事務,沒有的話新建乙個(不寫的情況下)
@transactional(propagation=propagation.not_supported) //容器不為這個方法開啟事務
@transactional(propagation=propagation.requires_new) //不管是否存在事務,都建立乙個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@transactional(propagation=propagation.mandatory) //必須在乙個已有的事務中執行,否則丟擲異常
@transactional(propagation=propagation.never) //必須在乙個沒有的事務中執行,否則丟擲異常(與propagation.mandatory相反)
@transactional(propagation=propagation.supports) //如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.
@transactional(propagation=propagation.nested)
@transactional (propagation = propagation.required,readonly=true) //readonly=true唯讀,不能更新,刪除
@transactional (propagation = propagation.required,timeout=30)//設定超時時間
@transactional (propagation = propagation.required,isolation=isolation.default)//設定資料庫隔離級別
用 spring 事務管理器,由spring來負責資料庫的開啟,提交,回滾.
預設遇到執行期例外(throw new runtimeexception("注釋");)會回滾,即遇到不受檢查(unchecked)的例外時回滾;
而遇到需要捕獲的例外(throw new exception("注釋");)不會回滾,即遇到受檢查的例外(就是非執行時丟擲的異常,編譯器會檢查到的異常叫受檢查例外或說受檢查異常)時,需我們指定方式來讓事務回滾 ,如下:
@transactional(rollbackfor=exception.class) //指定回滾,遇到異常exception時回滾
public void methodname()
@transactional(norollbackfor=exception.class)//指定不回滾,遇到執行期例外(throw new runtimeexception("注釋");)會回滾
public itimdaoimpl getitemdaoimpl()
spring事物註解
spring事物註解 事務的註解如下 transactional propagation propagation.required 其中,propagation有7個常量值,常用的有required和supports,下面是各種值的解釋 propagation required 如果當前沒有事務,就...
spring詳解(五) 事物管理
1 作為企業級應用程式框架,spring 在不同的事務管理 api 之上定義了乙個抽象層.而應用程式開發人員不必了解底層的事務管理 api,就可以使用 spring 的事務管理機制。2 spring 既支援程式設計式事務管理,也支援宣告式的事務管理。3 程式設計式事務管理 將事務管理 嵌入到業務方法...
手寫Spring事物註解
在spring中使用 transactional註解屬於聲名式事物,但我們要自己實現此類功能,就需要對程式設計試事物進行封裝。首先在資料庫新建了個user空表 在程式中新增兩條資料,在中間丟擲1 0的錯誤 執行後,檢視資料庫內容,已經插入了一條內容 加上自定義的事物註解 再次執行,檢視資料庫內容,已...