Spring中的事務傳播行為示例詳解

2022-10-07 01:09:07 字數 3619 閱讀 5235

一、背景介紹

www.cppcns.comspring 框架應該是每乙個人 j**aer 都必須接觸和學習的技術,spring 公司所提供的各種框架是 j**a 開發行業可參考的重要標準之一。

spring 中有 7 種型別的事務傳播行為。事務傳播行為是 spring 框架提供的一種事務管理方式,它是 spring 框架之中非常重要的乙個技術點,畢竟事務關係到應用程式和資料庫的互動,而資料更是網際網路行業最為重要的資源。

平時開發過程中事務都會有使用,但是沒有真正地總結過,尤其是事務中巢狀事務的場景,此篇基礎知識文在此做乙個簡單的學習總結,

二、事務

1、事務的特徵

2、事務的隔離級別

mysql 預設的事務隔離級別是 rep程式設計客棧eatable_read

3、spring 事務的傳播行為

三、**演示

準備動作:新建乙個 spring 專案,資料庫指令碼見:

set names utf8mb4;

set foruknlreign_key_checks = 0;

-- ----------------------------

-- table structure for customer

-- ----------------------------

drop tabuknlrle if exists `customer`;

create table `customer` (

`id` int(11) not null auto_increment,

`name` varchar(255) collate utf8mb4_bin default null,

`remark` varchar(255) collate utf8mb4_bin default null,

primary key (`id`)

) engine=innodb auto_increment=4 default charset=utf8mb4 collate=utf8mb4_bin;

-- ----------------------------

-- records of customer

-- ----------------------------

begin;

insert into `customer` values (1, 'a', 'a');

insert into `customer` values (2, 'b', 'b');

insert into `customer` values (3, 'c', 'c');

commit;

set foreign_key_checks = 1;

測試步驟為:方法 a 中呼叫方法 b 和 方法 c,三個方法各自運算元據庫中的一條資料,然後方法 a、b、c 組合新增事務

偽**為:

function a()

① propagation.required(預設)

步驟:@transactional

function a()

結果:資料庫中無資料

說明:方法 b 和方法 c 雖然沒有自己的事務,但是外層的方法 a 是有事務的,由於預設的事務傳播機制,所以方法 b 和 c 都加入到了 a 的事務之中,所以當 c 報錯時,b 也隨著回滾了。

② propagation.supports

步驟:@transactional

function a()

結果:資料庫中有兩條資料

說明:propagation.supports 的意思是當前有事務則加入,沒有則不新增事務,所以,由於 a 是沒有事務的,那麼 b 和 c 自然而然也就不加入事務中,而 c 中的報錯了,那麼自然而然也就不會進行資料回滾。

③ propagation.mandatory

步驟:@transactional

function a()

結果:不僅資料庫中無資料,而且執行時報錯:

org.springframework.transaction.illegaltransactionstateexception: no existing transaction found for transaction marked with propagation 'mandatory'

說明:propagation.mandatory 的意思是當前有事務則加入,沒有事務則丟擲異常。所以上述**在執行時丟擲了 illegaltransactionstateexception 異常。

④ propagation.requires_new

步驟:function a()

結果:資料庫中僅有方法 b 的一條資料。

說明:propagation.requires_new 的意思是重新建立乙個新的事務,如果當前存在事務,延緩當前的事務。

這個理解起來有點拗。結合上述**案例來看,首先 b 和 c 都是有各自的事務的,所以在 c 丟擲異常後,c 會回滾,而 b 則會正常插入一條資料,畢竟兩者的事務的獨立的,但是此時 a 也是有事務的,並且 a 的事務是在 b 和 c 之後再執行的,所以當 c 丟擲異常之後,a 自然而然也就捕獲到了,那麼 a 的事務也會回滾,所以資料庫中 a 插入的資料也被回滾掉了。

⑤ propagation.not_supported

步驟:function a()

結果:資料庫中有 b 和 c 兩條資料。

說明:prop 的意思是當前**以非事務的方式執行,就算有事務,而已暫停當前事務。

結合上面的偽**來看,雖然 a 是有事務的,但是 b 和 c 的註解為 not_supported,意思是我這個方法是不需要加入事務中的,所以 b 和 c 是沒有加入 a 的事務中去的,所以哪怕 b 丟擲異常,由於不參會事務,所以 b 和 c 的資料都是不會回滾的,所以資料庫中就會有 b 和 c 兩條資料。

⑥ propagation.never

步驟:function a()

結果:資料庫中無資料,並且執行時報錯

org.springframework.transaction.illegaltransactionstateexception: existing transaction found for transaction marked with propagation 'never'

說明:propagation.never 的意思是以非事務的方式去執行,如果有事務,則丟擲異常。

上述偽**中,a 是有事務的,但是 b 和 c 新增了 never 的事務,意思是別給我加事務,我拒絕,你要是給我加了事務我就給你拋異常。

⑦ propagation.nested

步驟:function a()

結果:結果就是沒有結果,因為 jpa 是不支援這種迴圈巢狀事務的,所以在執行的時候就會丟擲異常:

org.springframework.transaction.nestedtransactionnotsupportedexception: jpadialect does not support s**epoints - check your jpa provider's capabilities

說明:propagation.nested 的意思是如果外層沒有事務,則內層會新增乙個,而如果外層有事務,則內層會巢狀一層事務,即內層是有兩層事務的。

四、其他

總結本文標題: spring中的事務傳播行為示例詳解

本文位址:

Spring中事務的傳播行為

spring的事務相對於資料庫的事務有自己的特點,這種特性叫做事務傳播機制。事務傳播機制定義了事務在多個方法的呼叫中是如何傳遞的。如下幾種 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是預設的事務傳播行...

spring 事務傳播行為

事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...

Spring事務傳播行為

你們說一下什麼是傳播行為,有幾種傳播行為,是不是有7種傳播行為,你們看一段 就知道傳播行為是怎麼用的,它是產生在 多個事務中,我定義乙個 class userservice 這個行為你不會不知道,行為是基礎知識,userdao.add 是不是這樣的,我在add方法上加上註解,logservice.a...