spring事務註解

2021-05-27 12:37:47 字數 3968 閱讀 5974

@transactional只能被應用到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 事務註解 預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不...

spring事務註解

transactional只能被應用到public方法上,對於其它非public的方法,如果標記了 transactional也不會報錯,但方法沒有事務功能.spring使用宣告式事務處理,預設情況下,如果被註解的資料庫操作方法中發生了unchecked異常,所有的資料庫操作將rollback 如果...

spring 事務註解

配置檔案 value class 上面配置的意思就是配置面向切面,只要servcie中的方法丟擲exception,那麼insert,update,delete的sql方法都會回滾。測試時,可以在service方法中故意丟擲乙個異常,throw new exception test 那麼資料庫就不會...