国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試突擊:說一下 Spring 事務傳播機制?

開發 前端
Spring 事務傳播機制是包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的。

Spring 事務傳播機制是指,包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的。

既然是“事務傳播”,所以事務的數量應該在兩個或兩個以上,Spring 事務傳播機制的誕生是為了規定多個事務在傳播過程中的行為的。比如方法 A 開啟了事務,而在執行過程中又調用了開啟事務的 B 方法,那么 B 方法的事務是應該加入到 A 事務當中呢?還是兩個事務相互執行互不影響,又或者是將 B 事務嵌套到 A 事務中執行呢?所以這個時候就需要一個機制來規定和約束這兩個事務的行為,這就是 Spring 事務傳播機制所解決的問題。

Spring 事務傳播機制有哪些?

Spring 事務傳播機制可使用 @Transactional(propagation=Propagation.REQUIRED) 來定義,Spring 事務傳播機制的級別包含以下 7 種:

  1. Propagation.REQUIRED:默認的事務傳播級別,它表示如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
  2. Propagation.SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
  3. Propagation.MANDATORY:(mandatory:強制性)如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
  4. Propagation.REQUIRES_NEW:表示創建一個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部方法會新開啟自己的事務,且開啟的事務相互獨立,互不干擾。
  5. Propagation.NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  6. Propagation.NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
  7. Propagation.NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于PROPAGATION_REQUIRED。

以上 7 種傳播機制,可根據“是否支持當前事務”的維度分為以下 3 類:

看到這里,有人可能會說:說了這么多,我也看不懂啊,即使看懂了,我也記不住啊?這要咋整?

沒關系,接下來我們用一個例子,來說明這 3 類事務傳播機制的區別。

以情侶之間是否要買房為例,我們將以上 3 類事務傳播機制可以看作是戀愛中的 3 類女生類型:

  • 普通型
  • 強勢型
  • 懂事型

這三類女生如下圖所示:

支持當前事務的“女生”,這里的事務指的是“房子”,它分為 3 種(普通型女生):

  • Propagation.REQUIRED(需要有房子):有房子了咱們一起住,沒房子了咱們一起賺錢買房子。
  • Propagation.SUPPORTS(可以有房子):有房子了就一起住,沒房子了咱們就一起租房子。
  • Propagation.MANDATORY(強制有房子):有房子了就一起住,沒房子了就分手。

不支持當前事務的“女生”也分為 3 種(強勢型或者叫事業型):

  • Propagation.REQUIRES_NEW:不要你的房子,必須一起賺錢買房子。
  • Propagation.NOT_SUPPORTED:不要你的房子,必須一起租房子。
  • Propagation.NEVER:必須一起租房子,你有房子就分手。

最后一種是嵌套性事務 Propagation.NESTED,它屬于懂事型女友,如果有房子了就以房子為基礎做點小生意,賣個花生、水果啥的,如果買賣成了,那就繼續發展;如果失敗了,至少還有房子;如果沒房子也沒關系,一起賺錢買房子。

事務傳播機制使用與演示

接下來我們演示一下事務傳播機制的使用,以下面 3 個最典型的事務傳播級別為例:

  • 支持當前事務的 REQUIRED;
  • 不支持當前事務的 REQUIRES_NEW;
  • 嵌套事務 NESTED。

下來我們分別來看。

事務傳播機制的示例,需要用到以下兩張表:

-- 用戶表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`password` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`createtime` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC;
-- 日志表
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` text NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

創建一個 Spring Boot 項目,核心業務代碼有 3 個:UserController、UserServcie 以及 LogService。在 UserController 里面調用 UserService 添加用戶,并調用 LogService 添加日志。

REQUIRED 使用演示

REQUIRED 支持當前事務。

UserController 實現代碼如下,其中 save 方法開啟了事務:

@RestController
public class UserController {
@Resource
private UserService userService;
@Resource
private LogService logService;
@RequestMapping("/save")
@Transactional
public Object save(User user) {
// 插入用戶操作
userService.save(user);
// 插入日志
logService.saveLog("用戶插入:" + user.getName());
return true;
}
}

UserService 實現代碼如下:

@Service
public class UserService {
@Resource
private UserMapper userMapper;
@Transactional(propagation = Propagation.REQUIRED)
public int save(User user) {
return userMapper.save(user);
}
}

LogService 實現代碼如下:

@Service
public class LogService {
@Resource
private LogMapper logMapper;
@Transactional(propagation = Propagation.REQUIRED)
public int saveLog(String content) {
// 出現異常
int i = 10 / 0;
return logMapper.saveLog(content);
}
}

執行結果:程序報錯,兩張表中都沒有插入任何數據。

執行流程描述:

  1. 首先 UserService 中的添加用戶方法正常執行完成。
  2. LogService 保存日志程序報錯,因為使用的是 UserController 中的全局事務,所以整個事務回滾,步驟 1 中的操作也跟著回滾。
  3. 所以數據庫中沒有添加任何數據。

REQUIRED_NEW 使用演示

REQUIRED_NEW 不支持當前事務。

UserController 實現代碼:

@RequestMapping("/save")
@Transactional
public Object save(User user) {
// 插入用戶操作
userService.save(user);
// 插入日志
logService.saveLog("用戶插入:" + user.getName());
return true;
}

UserService 實現代碼:

@Service
public class UserService {
@Resource
private UserMapper userMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public int save(User user) {
System.out.println("執行 save 方法.");
return userMapper.save(user);
}
}

LogService 實現代碼:

@Service
public class LogService {
@Resource
private LogMapper logMapper;

@Transactional(propagation = Propagation.REQUIRES_NEW)
public int saveLog(String content) {
// 出現異常
int i = 10 / 0;
return logMapper.saveLog(content);
}
}

程序執行結果:

User 表中成功添加了一條用戶數據,Log 表執行失敗,沒有加入任何數據,但它并沒有影響到 UserController 中的事務執行。

通過以上結果可以看出:LogService 中使用的是單獨的事務,雖然 LogService 中的事務執行失敗了,但并沒有影響 UserController 和 UserService 中的事務。

NESTED 使用演示

NESTED 是嵌套事務。

UserController 實現代碼如下:

@RequestMapping("/save")
@Transactional
public Object save(User user) {
// 插入用戶操作
userService.save(user);
return true;
}

UserService 實現代碼如下:

@Transactional(propagation = Propagation.NESTED)
public int save(User user) {
int result = userMapper.save(user);
System.out.println("執行 save 方法.");
// 插入日志
logService.saveLog("用戶插入:" + user.getName());
return result;
}

LogService 實現代碼如下:

@Transactional(propagation = Propagation.NESTED)
public int saveLog(String content) {
// 出現異常
int i = 10 / 0;
return logMapper.saveLog(content);
}

最終執行結果,用戶表和日志表都沒有添加任何數據。

執行流程描述:

  1. UserController 中調用了 UserService 的添加用戶方法,UserService 使用 NESTED 循環嵌套事務,并成功執行了添加用戶的方法。
  2. UserService 中調用了 LogService 的添加方法,LogService 使用了 NESTED 循環嵌套事務,但在方法執行中出現的異常,因此回滾了當前事務。
  3. 因為 UserService 使用的是嵌套事務,所以發生回滾的事務是全局的,也就是說 UserService 中的添加用戶方法也被回滾了,最終執行結果是用戶表和日志表都沒有添加任何數據。

總結

Spring 事務傳播機制是包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的。事務的傳播級別有 7 個,支持當前事務的:REQUIRED、SUPPORTS、MANDATORY;不支持當前事務的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事務 NESTED,其中 REQUIRED 是默認的事務傳播級別。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-06-29 11:01:05

MySQL事務隔離級別

2022-09-05 07:06:59

BeanSpring

2023-09-12 14:56:13

MyBatis緩存機制

2022-01-13 06:59:40

HashMap底層面試

2022-05-18 07:43:09

Exchange交換器JUC

2022-10-09 20:52:19

事務隔離級別傳播機制

2023-02-02 07:06:10

2023-10-30 07:36:19

Spring事務傳播機制

2022-03-09 07:35:24

線程池線程參數

2022-02-17 08:02:08

線程Java生命周期

2022-07-20 07:29:55

TCPIP協議

2023-02-18 13:34:14

Nacos健康檢查機制

2022-09-19 06:16:23

事務隔離級別Spring

2025-03-10 07:05:07

2023-02-06 07:01:51

2021-07-28 10:08:19

類加載代碼塊面試

2022-06-07 12:03:33

Java內存模型

2023-02-08 08:32:41

輪詢鎖

2022-06-06 15:33:20

線程Java釋放鎖

2023-11-02 07:52:30

Java工具
點贊
收藏

51CTO技術棧公眾號

97国产在线播放| 亚洲国产成人精品久久| 国产精品毛片a∨一区二区三区|国 | 国产黑丝在线一区二区三区| 日韩中文字幕在线观看| a√资源在线| 免费成人在线影院| 狠狠色噜噜狠狠狠狠色吗综合| 成人国产一区| 中文一区一区三区高中清不卡| 亚洲精品国产精品乱码不99按摩| 亚洲天堂二区| 亚洲1区2区3区视频| 免费国产a级片| 黄色精品免费| 国产成人久久久精品一区| 亚洲精品一区| 欧美肥胖老妇做爰| 色播视频在线观看| 一区二区三区视频在线看| 久久久久99精品成人片| 高清不卡一二三区| 亚洲精品中文字幕乱码三区不卡| 欧美理论在线| 神马影院午夜我不卡影院| 午夜在线a亚洲v天堂网2018| 日韩电影大全在线观看| 激情欧美一区二区三区在线观看| 精品婷婷色一区二区三区蜜桃| 91久久久精品国产| 国产日韩精品一区二区| 日韩1区2区| 粉嫩精品一区二区三区在线观看| 伊人精品视频| 国产精品xxxx| 欧美aaa在线| 精品久久一二三| 久久久久久毛片| 最近最新mv在线观看免费高清| 欧洲精品一区二区三区在线观看| 日韩黄色影院| 精品视频久久久久久| 五月天亚洲一区| 精品在线一区二区| 国产奶头好大揉着好爽视频| 久久―日本道色综合久久| 四色成人av永久网址| 亚洲欧美日韩中文在线| 奇米色欧美一区二区三区| 女同一区二区| 久久久精品欧美丰满| 成人18在线| 欧美黑人性生活视频| 欧美精品99| 黄色av免费在线播放| 欧美在线看片a免费观看| 国产精品.xx视频.xxtv| 7777精品伊久久久大香线蕉语言| 美腿丝袜亚洲色图| 日本a在线免费观看| 一本色道久久综合狠狠躁的推荐 | 国产福利一区二区三区视频| 国产精品久久久久永久免费看| 亚洲国产精品99| 综合久久婷婷| 粉嫩欧美一区二区三区| 日韩一级二级| 亚洲图片都市激情| 色噜噜狠狠成人中文综合| 久久99国产精一区二区三区| 91在线国产电影| 亚洲综合视频在线观看| 国产午夜久久av| 中文字幕一区二区三区精彩视频| 色一区在线观看| 日韩欧美不卡| 视频一区二区精品| 中文字幕欧美国产| 免费v片在线观看| 精品久久久久久一区二区里番| 亚洲不卡在线观看| 99久久精品国产亚洲精品| 成年人视频在线| 国产日韩精品在线播放| 国产精品久久久久精k8| 国内黄色精品| 国产毛片毛片| 成人av色在线观看| 欧美性猛交xxxx乱大交极品| 黄色一区二区三区四区| 黄色网页网址在线免费| 国产一区二区无遮挡| 亚洲国产中文字幕在线观看 | 欧美人成在线观看| 欧美黄色三级网站| 樱桃视频在线观看一区| 欧美久色视频| 麻豆国产在线| 国产日韩欧美久久| 91超碰rencao97精品| 亚洲成人av片| 国产不卡视频在线播放| 九九热线视频只有这里最精品| 国产精品播放| 欧美一区二区视频在线观看| 久久精品国产秦先生| 国产91亚洲精品久久久| av黄色免费| 日本一区二区三区视频在线观看| 亚洲国产精品成人av| 亚洲免费视频中文字幕| 一本色道久久综合狠狠躁篇的优点| 日韩国产在线| 18禁男女爽爽爽午夜网站免费| 18成人免费观看网站下载| 久久av.com| 亚洲精品网站在线播放gif| 欧美日韩免费视频| 黄色成人在线播放| 亚洲欧美激情视频在线观看一区二区三区| 免费在线观看成人av| 亚洲人体偷拍| 欧美视频网站| 国产黄色片免费在线观看| 91视频免费在线| 国产精品一区视频网站| 国内一区在线| 中文字幕日韩精品在线观看| 91在线免费播放| 麻豆91小视频| gogo大尺度成人免费视频| 黄网站欧美内射| 日韩精品免费在线视频| 91国产成人在线| 欧美丝袜一区二区三区| 欧美日韩在线免费观看| 欧美日韩国产中文精品字幕自在自线| 国产精品视频一区二区三区四蜜臂| 在线观看免费高清完整| 国产精品免费一区二区三区四区| 中文成人av在线| 国产一区二区三区不卡视频网站| 神马影院午夜我不卡| 欧美日韩日本国产| 激情丁香综合五月| 99re8精品视频在线观看| 三级a三级三级三级a十八发禁止| 亚洲精品女av网站| 欧美精品免费看| 欧美久久久久久蜜桃| 欧美高清精品3d| 欧美高清在线播放| 裸体女人亚洲精品一区| 色婷婷久久综合| 99久久精品费精品国产一区二区| 亚洲精品韩国| 国产真实有声精品录音| 亚洲日本网址| bt在线麻豆视频| 欧美videos另类精品| 在线中文字幕视频| 亚洲天堂2014| 一级成人国产| 视频在线不卡免费观看| 91午夜精品| 亚洲天堂1区| 三级毛片在线免费看| 日本福利视频一区| 亚洲一区二区三区精品在线观看| 综合视频免费看| 大陆极品少妇内射aaaaaa| 日本一区二区三区精品视频| 99国产视频在线| 黄色av资源| 999国产精品亚洲77777| 亚洲麻豆av| 一本久久精品一区二区| 亚洲最大成人网4388xx| 欧美精品成人一区二区三区四区| 欧美成人午夜剧场免费观看| 超碰97网站| 成人网在线观看| 国产精品久久一区| 美日韩精品免费视频| 亚洲第一视频在线观看| 日韩精品中文在线观看| 色天天综合久久久久综合片| 亚洲韩国精品一区| 日韩欧美在线网址| 亚洲国产精品一区二区久久| 亚洲视频一区在线观看| 日韩一区二区三区av| 精品视频在线播放| 亚洲欧美精品suv| 97视频在线观看免费高清完整版在线观看| 91在线视频导航| 在线看片线路1| 久久99视频| 午夜亚洲国产au精品一区二区| 4388成人网|