@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 那麼資料庫就不會...