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

2022-03-12 09:18:22 字數 3598 閱讀 9026

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

步驟一、在spring配置檔案中引入tx:命名空間

步驟

二、具有@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表示永不超時

注意的幾點:

如下:

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

public void methodname()

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

public itimdaoimpl getitemdaoimpl()

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...