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裡呼叫,不會再觸發 方法攔截。...