一、背景介紹
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...