SpringBoot事務隔離等級和傳播行為

2022-04-11 18:38:31 字數 2839 閱讀 8187

一、開啟事物管理

//import org.springframework.transaction.annotation.enabletransactionmanagement;

public

springbootservletinitializer

public

static

void

main(string args)

}二、配置事物

在需要事物的類或方法上使用@transactional(import org.springframework.transaction.annotation.transactional)

1、isolation 隔離級別(springboot預設值為

isolation.default)

用法:

@transactional(isolation=isolation.default)

public

void

test()

列舉值(org.springframework.transaction.annotation):

public

enum

isolation

default:預設值,表示使用底層資料庫的預設隔離級別。大部分資料庫為read_committed(mysql預設隔離級別為repeatable)

read_uncommitted:該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。 

read_committed:該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。 

repeatable_read:該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。 

serializable:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。 

通過使用isolation屬性設定,例如:@transactional(isolation = isolation.default)/2.

2、事物傳播行為 propagation(springboot預設值為propagation.required)

用法

@transactional(propagation=propagation.required)

public

void

test()

列舉值(org.springframework.transaction.annotation.propagation)

public

enum

propagation

required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。 

supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。 

mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。 

requires_new:建立乙個新的事務,如果當前存在事務,則把當前事務掛起。 

not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。 

never:以非事務方式執行,如果當前存在事務,則丟擲異常。 

nested:如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於required。 

指定方法:通過使用propagation屬性設定,例如:@transactional(propagation = propagation.required)

spring定義了七種傳播行為:

3、readonly=true唯讀,不能更新,刪除

@transactional(readonly=true)
三、常見坑點

1、遇到異常檢測不回滾,原因:預設runtimeexception級別才回滾,如果是eexception級別的異常需要手動新增

@transactional(rollbackfor=exception.class)
2、捕捉異常後事物不生效,原因:捕捉處理了異常導致框架無法感知異常,自然就無法回滾了。建議:若非實際業務要求,則在業務層統一丟擲異常,然後在控制層統一處理

@transactional(rollbackfor=exception.class

)public

void

test() catch

(exception e)

//主動捕捉異常導致框架無法捕獲,從而導致事物失效

}

參考1:

參考2:

參考3:

SpringBoot設定事務隔離等級

spring boot 使用事務非常簡單,首先使用註解 enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 transactional 便可。在下文中會有圖例 關於事務管理器,不管是jpa還是jdbc等都實現自介面 platform...

SpringBoot設定事務隔離等級

spring boot 使用事務非常簡單,首先使用註解 enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 transactional 便可。在下文中會有圖例 關於事務管理器,不管是jpa還是jdbc等都實現自介面 platform...

SpringBoot 事務隔離性和傳播性

spring中七種propagation類的事務屬性詳解 宣告式事務的第二個方面是隔離級別。隔離級別定義乙個事務可能受其他併發事務活動活動影響的程度。另一種考慮乙個事務的隔離級別的方式,是把它想象為那個事務對於事物處理資料的自私程度。在乙個典型的應用程式中,多個事務同時執行,經常會為了完成他們的工作...