Spring七中傳播行為詳解

2021-09-22 21:31:30 字數 4467 閱讀 4224

spring事物傳播行為

spring中事務的定義:

propagation(key屬性確定**應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。)有以下選項可供使用:

propagation_required—如果當前有事務,就用當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。

propagation_supports--支援當前事務,如果當前沒有事務,就以非事務方式執行。//如果外層方法沒有事務,

就會以非事務進行執行。

propagation_mandatory--支援當前事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new--新建事務,如果當前存在事務,把當前事務掛起。

propagation_not_supported--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

--- 如果當前有事務,就是以非事務進行執行

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

預設傳播行為為required

上節課已經把兩種傳播行為講完了,後面還有幾種,我就一一給大家講,這裡還有乙個supports,這種我給你講一下,

傳播行為應用場景,場景是什麼,這個事情說一下,比如我給你講乙個場景,開發的時候都是多個人整合,如果你碰到去

呼叫別人的service的時候,那麼說一下,你這個時候要記住一點,一定要搞清楚傳播行為,其實別人寫的乙個service,

你呼叫別人的service,別人的service也是加了事務註解的,你就要去問一下別人,什麼意思呢,就是說,問一下別人,

我的事務會不會影響到你的事務,這樣的,這裡就要考慮傳播行為了,如果不影響的話,你就用required_new就行了,

然後在這邊我再講一種,叫做支援supports,其實這個用的比較少,它是支援當前的事務,如果當前沒有事務,就以非事務

進行執行,這個你們知道是什麼意思嗎,知不知道什麼意思,這個其實就是事務巢狀,我馬上就要講巢狀了,支援當前事務,

如果當前沒有事務,就以非事務進行執行,這是什麼意思,有沒有誰能解釋一下的,這個其實什麼意思呢,在這邊說一下,

支援當前事務,如果當前沒有事務,比如這個時候你們看一下,如果add當前沒有事務的情況下,然後我把addlog的事務級別設定一下,

@transactional(propagation = propagation.supports),那麼我來問一下,這個時候我突然報個錯,

@transactional(propagation = propagation.requires_new)

public void addlog()

// @transactional

public void add()

int i = 1/0,你們說一下這個是什麼意思,這個時候日誌能不能插入進去,這個時候log日誌能不能插入進去,當前沒有事務的情況下

就以非事務進行執行,就是這樣的,我設定的是新的級別,新的傳播行為,你們看一下,後面的幾種你們可以慢慢的去摸索一下就行了,

我把外面的事務給注釋掉了,你們看看效果,你們看一下是不是報錯了,最後我們重新整理一遍,是不是也有記錄的,我們想一下是什麼意思,

你們要記住,如果當前沒有事務的情況下,就以非事務進行執行,相當於我沒有事務,沒有事務的情況下,我肯定能夠插入進去,就是外面你

調我的方法的時候,如果沒有事務註解,裡面就以非事務進行執行,然後我們再講mandatory這種,支援當前事務,如果當前沒有事務就丟擲

異常,這也是借鑑一本書上寫的,如果外層方法沒有事務,就會以非事務進行執行,我們再說一種就是propagation_mandatory這種方式,

就是支援當前事務,如果當前沒有事務就丟擲異常,我們來設定一下這種傳播行為,這裡我來問你們,如果當期沒事務,你們看看,

當前是沒有事務的,然後執行肯定報錯,不是int i = 1/0報錯,是不是報錯了,什麼意思,他就是他沒有檢測到他當前有事務,

就是你的add呼叫我的方法是沒有事務,我們可以把這個註解加上去,支援當前事務,如果當前沒有事務才會報錯,有事務怎麼

可能報錯,requires_new我們已經講了,我們再講一種propagation_not_supports,以非事務執行操作,如果當前存在事務,

就把當前事務掛起,這是什麼意思呢,有誰知道,就是相當於,如果當前有事務,正好是和propagation_supports相反的,

如果當前有事務,就是以非事務進行執行,就是剛好相反的,看下效果就行了,add存在事務,如果當前存在事務,掛起不報錯,

只是掛起,相當於失效,不會報錯,就是addlog這邊會以非事務進行執行,然後我們搞乙個 int i = 1/0,

public void addlog()

報錯了,但是資料庫日誌記錄還是有的,當前如果有事務就把當前的事務掛起,這個比較簡單你們下去看一下,都是比較容易的,

然後我們這裡再講一種,以非事務進行執行,如果當前存在事務,則丟擲異常,以非事務進行異常,你們下去試一試,就是看效果,

我要說一下,以非事務進行執行,如果當前有事務就拋異常,這個才會拋異常,你們看一下,

existing transaction found for transaction marked with propagation 'never'

如果當前存在事務的情況下,他就拋個異常出來,是不是這樣的,你們下去試一下就行了,傳播行為不是我們的核心,

核心是我們的手寫事務

package com.learn.dao;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.jdbc.core.jdbctemplate;

import org.springframework.stereotype.repository;

@repository

public class logdao

}

package com.learn.service;

public inte***ce logservice

package com.learn.service.impl;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.stereotype.service;

import org.springframework.transaction.annotation.propagation;

import org.springframework.transaction.annotation.transactional;

import com.learn.dao.logdao;

import com.learn.service.logservice;

/** * 7種傳播行為

* 這個問的比較多的

* 注入到spring容器裡面去@service

* *

* @author leon.sun

* */

@service

public class logserviceimpl implements logservice

}

package com.learn.service;

//user 服務層

public inte***ce userservice

package com.learn.service.impl;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.stereotype.service;

import org.springframework.transaction.annotation.transactional;

import com.learn.dao.userdao;

import com.learn.service.logservice;

import com.learn.service.userservice;

import com.learn.transaction.transactionutils;

@service

public class userserviceimpl implements userservice

public void del()

}

package com.learn;

import com.learn.service.userservice;

public class test001

}

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

一 背景介紹 www.cppcns.comspring 框架應該是每乙個人 j aer 都必須接觸和學習的技術,spring 公司所提供的各種框架是 j a 開發行業可參考的重要標準之一。spring 中有 7 種型別的事務傳播行為。事務傳播行為是 spring 框架提供的一種事務管理方式,它是 s...

Spring七種事務傳播行為

如果有事務在執行,當前的方法就在這個事務內執行,否則就開啟乙個新的事務,並在自己的事務內執行 常用 當前的方法必須啟動新事務,並在它自己的事務內執行。如果有事務在執行,應該將其掛起。常用 如果有事務在執行,當前這個方法就在這個事務內執行,否則它可以不執行在事務中 當前的方法不應該執行在事務中,如果有...

Spring 事務七大傳播行為

transactional的屬性 propagation,事務傳播行為,列舉型別 propagation。注意 事務傳播行為在同一service類中是無效的,只有在aservice 呼叫 bservice才有效。因為事務處理是通過aop 攔截工作的,在同一service裡呼叫,不會再觸發 方法攔截。...