Spring事物註解管理詳解

2021-06-16 07:39:02 字數 4068 閱讀 4913

要使事務註解有效,首先需要在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的錯誤 執行後,檢視資料庫內容,已經插入了一條內容 加上自定義的事物註解 再次執行,檢視資料庫內容,已...