Spring學習JdbcTemplate數(shù)據(jù)庫事務參數(shù)
Spring JdbcTemplate數(shù)據(jù)庫事務參數(shù)
@Transactional() 注解里有不少參數(shù),其中我們常用到的如下:

一、propagation
表示事務傳播行為。就是說多個事務方法之間進行調(diào)用,這個過程中事務是如何進行管理的。
這里的事務方法就是指對數(shù)據(jù)庫表數(shù)據(jù)進行變化操作的方法。
舉例:
有個 update() 方法:
public void update() {
}還有個 add() 方法:
public void add() {
// 調(diào)用了update()方法
update()
}那么,現(xiàn)在當其中一個方法加上了事務注解 @Transactional 后,調(diào)用執(zhí)行過程是怎樣的?或者說兩個都加了事務注解,又該如何?
為了解決問題,spring 事務傳播行為有 7 種:
- REQUIRED:默認參數(shù)。如果有事務在運行,當前方法就在這個事務內(nèi)運行,否則就開啟一個新的事務,并在自己的事務內(nèi)運行。
- REQUIRES_NEW:當前的方法必須在啟動新事務,并在它自己的事務內(nèi)運行,如果有事務在進行,應該將它掛起。
- SUPPORTS:如果有事務在運行,當前的方法就在這個事務內(nèi)運行,否則它可以不運行在事務中。
- NOT_SUPPORTED:當前的方法不應該運行在事務中,如果有運行的事務,將它掛起。
- MANDATORY:當前的方法必須運行在事務內(nèi)部,如果沒有正在運行的事務,就拋出異常。
- NEVER:當前的方法不應該在事務中運行,如果有運行的事務,就拋出異常。
- NESTED:如果有事務在運行,當前的方法就應該在這個事務的嵌套事務內(nèi)運行,否則,就啟動一個新的事務,并在自己的事務內(nèi)運行。
1. REQUIRED
如果有事務在運行,當前方法就在這個事務內(nèi)運行,否則就開啟一個新的事務,并在自己的事務內(nèi)運行。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// do something
}當調(diào)用 methodA 時,因為當前上下文不存在事務,所以會開啟一個新的事務。當執(zhí)行到 methodB 時,發(fā)現(xiàn)當前上下文存在事務,因此就加入到當前事務來執(zhí)行。當單獨調(diào)用 methodB 時,因為當前上下文不存在事務,所以會開啟一個新的事務。
2. REQUIRES_NEW
當前的方法必須在啟動新事務,并在它自己的事務內(nèi)運行,如果有事務在進行,應該將它掛起。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
doSomeThingA();
methodB();
doSomeThingB();
// do something else
}
// 事務屬性為REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something
}當調(diào)用 methodA 時,開啟了 事務 A。執(zhí)行到 methodB 時,開啟一個事務B,此時事務 A 掛起,當事務 B 執(zhí)行完成后,繼續(xù)執(zhí)行事務 A 。
- 這里的事務 A 稱為外層事務。
- 這里的事務 B 則稱為內(nèi)層事務。
3. SUPPORTS
如果有事務在運行,當前的方法就在這個事務內(nèi)運行,否則它可以不運行在事務中。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事務屬性為SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}當調(diào)用 methodA 時,methodB 加入到 methodA 的事務中,事務的執(zhí)行。當單獨的調(diào)用 methodB 時,methodB方法是非事務的執(zhí)行的。
4. NOT_SUPPORTED
當前的方法不應該運行在事務中,如果有運行的事務,將它掛起。

- 當調(diào)用 methodA 時,開啟 事務 A。當執(zhí)行到 methodB 時,掛起事務A,以非事務的方式執(zhí)行 methodB 。
- 當單獨的調(diào)用 methodB 時,methodB方法是非事務的執(zhí)行的。
5. MANDATORY
當前的方法必須運行在事務內(nèi)部,如果沒有正在運行的事務,就拋出異常。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事務屬性為MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// do something
}當調(diào)用 methodA 時,methodB 則加入到 methodA 的事務中,事務地執(zhí)行。當單獨調(diào)用 methodB 時,因為當前沒有一個活動的事務,則會拋出異常。
6. NEVER
當前的方法不應該在事務中運行,如果有運行的事務,就拋出異常。
7. NESTED
如果有事務在運行,當前的方法就應該在這個事務的嵌套事務內(nèi)運行,否則,就啟動一個新的事務,并在自己的事務內(nèi)運行。

- 當單獨執(zhí)行 methodB ,開啟事務 B,執(zhí)行。
- 當執(zhí)行 methodA 時,開啟事務 A,執(zhí)行到 methodB,開啟內(nèi)層事務 B。
注意 當執(zhí)行 methodA 時,這里是一個嵌套事務。
如果外層事務失敗,則會回滾內(nèi)層事務所做的操作。但是內(nèi)層事務的失敗不會引起外層事務的回滾。
二、ioslation
設(shè)置事務隔離級別。
因為不同的事務隔離級別會引起不同的問題,比如:臟讀、不可重復讀、幻讀。
相關(guān)的內(nèi)容在之前有過介紹,有興趣的可以自行跳轉(zhuǎn)過去:
【Mysql】數(shù)據(jù)庫事務,臟讀、幻讀、不可重復讀
所以要解決,需要設(shè)置對應的隔離級別:
- READ_UNCOMMITTED: 讀未提交
- READ_COMMITTED: 讀已提交
- REPEATABLE_READ: 可重復讀
- SERIALIZABLE: 串行化

三、timeout
設(shè)置超時時間。
事務需要在一定時間內(nèi)進行提交,如果沒提交,就回滾。
默認值是 -1 ,表示不超時。如果設(shè)置時間,單位是秒(s)。
四、readOnly
設(shè)置是否只讀。
默認值 false,表示可以查詢,也可以進行添加、修改、刪除操作。
當設(shè)置為 true,只可以進行查詢操作。
五、rollbackFor
設(shè)置出現(xiàn)哪些異常后就進行事務的回滾。
六、noRollbackFor
設(shè)置出現(xiàn)哪些異常后,不進行事務的回滾。
以上就是Spring學習JdbcTemplate數(shù)據(jù)庫事務參數(shù)的詳細內(nèi)容,更多關(guān)于Spring JdbcTemplate數(shù)據(jù)庫事務的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springcloud GateWay網(wǎng)關(guān)配置過程圖解
這篇文章主要介紹了Springcloud GateWay網(wǎng)關(guān)配置過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12
spring boot使用@Async異步注解的實現(xiàn)原理+源碼
通常我們都是采用多線程的方式來實現(xiàn)上述業(yè)務功能,但spring 提供更優(yōu)雅的方式來實現(xiàn)上述功能,就是@Async 異步注解,在方法上添加@Async,spring就會借助AOP,異步執(zhí)行方法,接下來通過本文給大家介紹spring boot異步注解的相關(guān)知識,一起看看吧2021-06-06
淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題
本篇文章主要介紹了淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題,具有一定的參考價值,有需要的可以了解一下2017-08-08
關(guān)于Java中static關(guān)鍵字的用法
這篇文章主要介紹了關(guān)于Java中static關(guān)鍵字的用法,static:意為靜態(tài)的,在?Java?里面作為靜態(tài)修飾符,可以理解為全局的意思,static?不僅可以修飾成員變量,成員方法,還可以修飾代碼塊,需要的朋友可以參考下2023-08-08

