成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

加入事務和嵌套事務有什么區別?你明白了嗎?

開發 前端
加入事務(REQUIRED)和嵌套事務(NESTED)都是事務傳播機制中的兩種傳播級別,如果當前不存在事務,那么二者的行為是一致的;但如果當前存在事務,那么加入事務的事務傳播級別當遇到異常時會回滾全部事務,而嵌套事務則是回滾部分事務。

加入事務和嵌套事務是指在 Spring 事務傳播機制中的加入事務(REQUIRED)和嵌套事務(NESTED)的區別,二者看似很像,實則截然不同,那么它們有什么區別呢?接下來我們一起來看。

Spring 事務傳播機制是指,包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的,Spring 事務傳播機制分為 3 大類,總共 7 種級別,如下圖所示:

其中,支持當前事務的 REQUIRED 是加入(當前)事務,而 NESTED 是嵌套(當前)事務,本文要討論的就是這二者的區別。

1.加入事務

加入事務 REQUIRED 是 Spring 事務的默認傳播級別。

所謂的加入當前事務,是指如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。我們這里重點要討論的是第一種情況,也就是當前存在事務的情況下,它和嵌套事務的區別,接下來我們通過一個示例來看加入事務的使用和執行特點。

我們要實現的是用戶添加功能,只不過在添加用戶時,我們需要給用戶表和日志表中分別插入一條數據,UserController 實現代碼如下:

@Transactional(propagation = Propagation.REQUIRED)
@RequestMapping("/add")
public int add(UserInfo userInfo) {
int result = 0;
int userResult = userService.add(userInfo);
System.out.println("用戶添加結果:" + userResult);
if (userResult > 0) {
LogInfo logInfo = new LogInfo();
logInfo.setName("添加用戶");
logInfo.setDesc("添加用戶結果:" + userResult);
int logResult = logService.add(logInfo);
System.out.println("日志添加結果:" + logResult);
result = 1;
}
return result;
}

從上述代碼可以看出,添加用戶使用了事務,并設置了事務傳播機制為 REQUIRED(加入事務),此控制器調用的 UserService 實現代碼如下:

@Transactional(propagation = Propagation.REQUIRED)
public int add(UserInfo userInfo) {
int result = userMapper.add(userInfo);
return result;
}

從上述代碼可以看出,它也是使用事務,并設置了事務的傳播機制為 REQUIRED,而 LogService 也是類似的實現代碼:

@Transactional(propagation = Propagation.REQUIRED)
public int add(LogInfo logInfo) {
int result = logMapper.add(logInfo);
try {
int number = 10 / 0;
} catch (Exception e) {
// 手動回滾事務
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}

從上述代碼我們可以看出,在設置事務傳播機制的同時,我們也在程序中主動的設置了一個異常。

運行以上程序的執行結果如下圖所示:

從上述結果我們可以看出:當我們設置了加入事務的事務傳播機制之后,程序的執行結果是將用戶表和日志表的事務都回滾了。

2.嵌套事務

嵌套事務指的是事務傳播級別中的 NESTED,所謂的嵌套當前事務,是指如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于 REQUIRED。當然,我們本文要研究的重點也是第一種情況,也就是當前存在事務的前提下,嵌套事務和加入事務的區別。

所以接下來我們將上面代碼中的事務傳播機制改為 NESTED,它的實現代碼如下。

UserController 實現代碼如下:

@Transactional(propagation = Propagation.NESTED)
@RequestMapping("/add")
public int add(UserInfo userInfo) {
int result = 0;
int userResult = userService.add(userInfo);
System.out.println("用戶添加結果:" + userResult);
if (userResult > 0) {
LogInfo logInfo = new LogInfo();
logInfo.setName("添加用戶");
logInfo.setDesc("添加用戶結果:" + userResult);
int logResult = logService.add(logInfo);
System.out.println("日志添加結果:" + logResult);
result = 1;
}
return result;
}

UserService 實現代碼如下:

@Transactional(propagation = Propagation.NESTED)
public int add(UserInfo userInfo) {
int result = userMapper.add(userInfo);
return result;
}

LogService 實現代碼如下:

@Transactional(propagation = Propagation.NESTED)
public int add(LogInfo logInfo) {
int result = logMapper.add(logInfo);
try {
int number = 10 / 0;
} catch (Exception e) {
// 手動回滾事務
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}

運行以上程序的執行結果如下圖所示:

從上述結果可以看出:當設置嵌套事務的事務傳播級別之后,程序執行了部分事務的回滾,用戶表添加的事務沒有回滾,只是日志表的事務回滾了。

3.加入事務 VS 嵌套事務

加入事務(REQUIRED)和嵌套事務(NESTED)都是事務傳播機制的兩種傳播級別,如果當前不存在事務,那么二者的行為是一樣的;但如果當前存在事務,那么加入事務的事務傳播級別在遇到異常之后,會將事務全部回滾;而嵌套事務在遇到異常時,只是執行了部分事務的回滾。

4.嵌套事務實現原理

事務全部回滾很好理解,這本來就是事務原子性的一種體現,而嵌套事務中的部分事務回滾是怎么實現的呢?

嵌套事務只所以能實現部分事務的回滾,是因為在數據庫中存在一個保存點(savepoint)的概念,以 MySQL 為例,嵌套事務相當于新建了一個保存點,而滾回時只回滾到當前保存點,因此之前的事務是不受影響的,這一點可以在 MySQL 的官方文檔匯總找到相應的資料:https://dev.mysql.com/doc/refman/5.7/en/savepoint.html

而 REQUIRED 是加入到當前事務中,并沒有創建事務的保存點,因此出現了回滾就是整個事務回滾,這就是嵌套事務和加入事務的區別。

保存點就像玩通關游戲時的“游戲存檔”一樣,如果設置了游戲存檔,那么即使當前關卡失敗了,也能繼續上一個存檔點繼續玩,而不是從頭開始玩游戲。

總結

加入事務(REQUIRED)和嵌套事務(NESTED)都是事務傳播機制中的兩種傳播級別,如果當前不存在事務,那么二者的行為是一致的;但如果當前存在事務,那么加入事務的事務傳播級別當遇到異常時會回滾全部事務,而嵌套事務則是回滾部分事務。嵌套事務之所以能回滾部分事務,是因為數據庫中存在一個保存點的概念,嵌套事務相對于新建了一個保存點,如果出現異常了,那么只需要回滾到保存點即可,這樣就實現了部分事務的回滾。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-09-27 07:31:57

Property模式數據

2024-03-05 18:19:07

localhostLinux數據庫

2022-10-09 20:52:19

事務隔離級別傳播機制

2022-08-29 07:05:02

JSRJava語言

2023-12-06 08:01:03

CSSPostCSS

2022-07-18 07:11:35

請求轉發請求重定數據共享

2022-12-30 08:35:00

2022-08-16 07:32:03

RestfulSOAPRPC

2024-05-27 00:00:00

localhostIPv6IPv4

2024-02-04 00:00:00

@ValidSpring@Validated

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2020-11-09 14:07:53

PyQtQt編程

2022-06-06 14:53:02

LoRaLoRaWAN

2022-09-08 18:38:26

LinuxWindowsmacOS

2021-12-17 14:40:02

while(1)for(;;)語言

2022-02-27 15:33:22

安全CASBSASE

2024-05-27 00:40:00

2021-05-16 14:26:08

RPAIPACIO

2022-08-02 08:23:37

SessionCookies
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频精品 | 亚洲视频一区在线 | 亚洲国产日韩欧美 | 日本人和亚洲人zjzjhd | 久久久久久久久久久高潮一区二区 | 成人精品在线观看 | 欧美久久久久久久久中文字幕 | 日本精品视频在线 | 激情一区二区三区 | 毛片韩国 | 亚洲三级在线观看 | 日韩成人在线免费观看 | 请别相信他免费喜剧电影在线观看 | 国产精品99久久久久久动医院 | 久久精品亚洲 | av大片在线观看 | 亚洲劲爆av | 欧美韩一区二区三区 | 日本精品一区二区 | 亚洲日本欧美 | 99精品久久 | 欧美福利一区 | 一区二区在线免费播放 | 天天躁日日躁狠狠的躁天龙影院 | 久久激情五月丁香伊人 | 欧美日韩精品久久久免费观看 | www.99re | 亚洲视频不卡 | 伊人二区 | 综合伊人| 五月综合久久 | 精品国产91乱码一区二区三区 | 四虎影视一区二区 | 天天久 | 91视频网址| 国产1区2区3区 | 国产一区二区精品在线观看 | 欧美二区三区 | 日韩欧美精品在线 | 亚洲成av人影片在线观看 | 成人国产在线视频 |