Spring 使用註解方式進行事務管理

2021-09-08 11:17:45 字數 4957 閱讀 5751

使用步驟:

步驟

一、在spring配置檔案中引入命名空間

步驟二、具有@transactional 註解的bean自動配置為宣告式事務支援

步驟

三、在介面或類的宣告處 ,寫乙個@transactional.

要是只在介面上寫, 介面的實現類就會繼承下來、介面的實現類的具體方法,可以覆蓋類宣告處的設定

@transactional   //類級的註解、適用於類中所有的public的方法

事務的傳播行為和隔離級別

大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。

事物註解方式: @transactional

當標於類前時, 標示類中所有方法都進行事物處理 , 例子:

@transactional

public class testservicebean implements testservice {}

當類中某些方法不需要事物時:

@transactional

public class testservicebean implements testservice

@transactional(propagation = propagation.not_supported)

public listgetall()

}

事物傳播行為介紹:

@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(timeout=30) //預設是30秒

事務隔離級別:

@transactional(isolation = isolation.read_uncommitted)

讀取未提交資料(會出現髒讀, 不可重複讀) 基本不使用

@transactional(isolation = isolation.read_committed)

讀取已提交資料(會出現不可重複讀和幻讀)

@transactional(isolation = isolation.repeatable_read)

可重複讀(會出現幻讀)

@transactional(isolation = isolation.serializable)

序列化mysql: 預設為repeatable_read級別

sqlserver: 預設為read_committed

髒讀: 乙個事務讀取到另一事務未提交的更新資料

不可重複讀: 在同一事務中, 多次讀取同一資料返回的結果有所不同, 換句話說, 

後續讀取可以讀到另一事務已提交的更新資料. 相反, "可重複讀"在同一事務中多次

讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料

幻讀: 乙個事務讀到另乙個事務已提交的insert資料

@transactional註解中常用引數說明

參 數 名 稱

功 能 描 述

readonly

該屬性用於設定當前事務是否為唯讀事務,設定為true表示唯讀,false則表示可讀寫,預設值為false。例如:@transactional(readonly=true)

rollbackfor

該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。例如:

指定單一異常類:@transactional(rollbackfor=runtimeexception.class)

指定多個異常類:@transactional(rollbackfor=)

續表)參 數 名 稱

功 能 描 述

rollbackforclassname

該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:

指定單一異常類名稱:@transactional(rollbackforclassname="runtimeexception")

指定多個異常類名稱:@transactional(rollbackforclassname=)

norollbackfor

該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:

指定單一異常類:@transactional(norollbackfor=runtimeexception.class)

指定多個異常類:@transactional(norollbackfor=)

norollbackforclassname

該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:

指定單一異常類名稱:@transactional(norollbackforclassname="runtimeexception")

指定多個異常類名稱:

@transactional(norollbackforclassname=)

propagation

該屬性用於設定事務的傳播行為,具體取值可參考表6-7。

例如:@transactional(propagation=propagation.not_supported,readonly=true)

isolation

該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定

timeout

該屬性用於設定事務的超時秒數,預設值為-1表示永不超時

注意的幾點:

1 @transactional 只能被應用到public方法上, 對於其它非public的方法,如果標記了@transactional也不會報錯,但方法沒有事務功能.

2用 spring 事務管理器,由spring來負責資料庫的開啟,提交,回滾.預設遇到執行期例外(throw new runtimeexception("注釋");)會回滾,即遇到不受檢查(unchecked)的例外時回滾;而遇到需要捕獲的例外(throw new exception("注釋");)不會回滾,即遇到受檢查的例外(就是非執行時丟擲的異常,編譯器會檢查到的異常叫受檢查例外或說受檢查異常)時,需我們指定方式來讓事務回滾 要想所有異常都回滾,要加上 @transactional( rollbackfor=) .如果讓unchecked例外不回滾: @transactional(notrollbackfor=runtimeexception.class)

如下:@transactional(rollbackfor=exception.class) //指定回滾,遇到異常exception時回滾

public void methodname()

@transactional(norollbackfor=exception.class)//指定不回滾,遇到執行期例外(throw new runtimeexception("注釋");)會回滾

public itimdaoimpl getitemdaoimpl()

3、@transactional 註解應該只被應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @transactional 註解,它也不會報錯, 但是這個被註解的方法將不會展示已配置的事務設定。

4、@transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。然而,請注意僅僅 @transactional 註解的出現不足於開啟事務行為,它僅僅 是一種元資料,能夠被可以識別 @transactional 註解和上述的配置適當的具有事務行為的beans所使用。上面的例子中,其實正是 元素的出現 開啟 了事務行為。

5、spring團隊的建議是你在具體的類(或類的方法)上使用 @transactional 註解,而不要使用在類所要實現的任何介面上。你當然可以在介面上使用 @transactional 註解,但是這將只能當你設定了基於介面的**時它才生效。因為註解是 不能繼承 的,這就意味著如果你正在使用基於類的**時,那麼事務的設定將不能被基於類的**所識別,而且物件也將不會被事務**所包裝(將被確認為嚴重的)。因 此,請接受spring團隊的建議並且在具體的類上使用 @transactional 註解。

Spring 使用註解方式進行事物管理

spring 使用註解方式進行事物管理 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservicebean implements testservice 當類中某些方法不需要事物時 transactional public cla...

Spring 使用註解方式進行事物管理

事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservicebean implements testservice 當類中某些方法不需要事物時 讀取資料庫中的資料時是不需要事務管理的,這種情...

Spring 使用註解方式進行事物管理

大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservicebean i...