最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解Spring的事務(wù)傳播機(jī)制

 更新時(shí)間:2022年09月28日 08:19:33   作者:Java中文社群  
Spring事務(wù)傳播機(jī)制是指,包含多個(gè)事務(wù)的方法在相互調(diào)用時(shí),事務(wù)是如何在這些方法間傳播的。本文通過(guò)示例詳細(xì)介紹了Spring的事務(wù)傳播機(jī)制,需要的可以參考一下

Spring 事務(wù)傳播機(jī)制是指,包含多個(gè)事務(wù)的方法在相互調(diào)用時(shí),事務(wù)是如何在這些方法間傳播的。

既然是“事務(wù)傳播”,所以事務(wù)的數(shù)量應(yīng)該在兩個(gè)或兩個(gè)以上,Spring 事務(wù)傳播機(jī)制的誕生是為了規(guī)定多個(gè)事務(wù)在傳播過(guò)程中的行為的。比如方法 A 開(kāi)啟了事務(wù),而在執(zhí)行過(guò)程中又調(diào)用了開(kāi)啟事務(wù)的 B 方法,那么 B 方法的事務(wù)是應(yīng)該加入到 A 事務(wù)當(dāng)中呢?還是兩個(gè)事務(wù)相互執(zhí)行互不影響,又或者是將 B 事務(wù)嵌套到 A 事務(wù)中執(zhí)行呢?所以這個(gè)時(shí)候就需要一個(gè)機(jī)制來(lái)規(guī)定和約束這兩個(gè)事務(wù)的行為,這就是 Spring 事務(wù)傳播機(jī)制所解決的問(wèn)題。

Spring 事務(wù)傳播機(jī)制有哪些?

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

  • Propagation.REQUIRED:默認(rèn)的事務(wù)傳播級(jí)別,它表示如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。
  • Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
  • Propagation.MANDATORY:(mandatory:強(qiáng)制性)如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
  • Propagation.REQUIRES_NEW:表示創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說(shuō)不管外部方法是否開(kāi)啟事務(wù),Propagation.REQUIRES_NEW 修飾的內(nèi)部方法會(huì)新開(kāi)啟自己的事務(wù),且開(kāi)啟的事務(wù)相互獨(dú)立,互不干擾。
  • Propagation.NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
  • Propagation.NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • Propagation.NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于 PROPAGATION_REQUIRED。

以上 7 種傳播機(jī)制,可根據(jù)“是否支持當(dāng)前事務(wù)”的維度分為以下 3 類:

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

沒(méi)關(guān)系,接下來(lái)我們用一個(gè)例子,來(lái)說(shuō)明這 3 類事務(wù)傳播機(jī)制的區(qū)別。

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

  • 普通型
  • 強(qiáng)勢(shì)型
  • 懂事型

這三類女生如下圖所示:

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

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

不支持當(dāng)前事務(wù)的“女生”也分為 3 種(強(qiáng)勢(shì)型或者叫事業(yè)型):

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

最后一種是嵌套性事務(wù) Propagation.NESTED,它屬于懂事型女友,如果有房子了就以房子為基礎(chǔ)做點(diǎn)小生意,賣個(gè)花生、水果啥的,如果買賣成了,那就繼續(xù)發(fā)展;如果失敗了,至少還有房子;如果沒(méi)房子也沒(méi)關(guān)系,一起賺錢買房子。

事務(wù)傳播機(jī)制使用與演示

接下來(lái)我們演示一下事務(wù)傳播機(jī)制的使用,以下面 3 個(gè)最典型的事務(wù)傳播級(jí)別為例:

  • 支持當(dāng)前事務(wù)的 REQUIRED;
  • 不支持當(dāng)前事務(wù)的 REQUIRES_NEW;
  • 嵌套事務(wù) NESTED。

下來(lái)我們分別來(lái)看。

事務(wù)傳播機(jī)制的示例,需要用到以下兩張表:

-- 用戶表
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;

創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,核心業(yè)務(wù)代碼有 3 個(gè):UserController、UserServcie 以及 LogService。在 UserController 里面調(diào)用 UserService 添加用戶,并調(diào)用 LogService 添加日志。

REQUIRED 使用演示

REQUIRED 支持當(dāng)前事務(wù)。

UserController 實(shí)現(xiàn)代碼如下,其中 save 方法開(kāi)啟了事務(wù):

@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 實(shí)現(xiàn)代碼如下:

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    @Transactional(propagation = Propagation.REQUIRED)
    public int save(User user) {
        return userMapper.save(user);
    }
}

LogService 實(shí)現(xiàn)代碼如下:

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

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

執(zhí)行結(jié)果:程序報(bào)錯(cuò),兩張表中都沒(méi)有插入任何數(shù)據(jù)。

執(zhí)行流程描述:

  • 首先 UserService 中的添加用戶方法正常執(zhí)行完成。
  • LogService 保存日志程序報(bào)錯(cuò),因?yàn)槭褂玫氖?UserController 中的全局事務(wù),所以整個(gè)事務(wù)回滾,步驟 1 中的操作也跟著回滾。
  • 所以數(shù)據(jù)庫(kù)中沒(méi)有添加任何數(shù)據(jù)。

REQUIRED_NEW 使用演示

REQUIRED_NEW 不支持當(dāng)前事務(wù)。

UserController 實(shí)現(xiàn)代碼:

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

UserService 實(shí)現(xiàn)代碼:

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public int save(User user) {
        System.out.println("執(zhí)行 save 方法.");
        return userMapper.save(user);
    }
}

LogService 實(shí)現(xiàn)代碼:

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

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

程序執(zhí)行結(jié)果:

User 表中成功添加了一條用戶數(shù)據(jù),Log 表執(zhí)行失敗,沒(méi)有加入任何數(shù)據(jù),但它并沒(méi)有影響到 UserController 中的事務(wù)執(zhí)行。

通過(guò)以上結(jié)果可以看出:LogService 中使用的是單獨(dú)的事務(wù),雖然 LogService 中的事務(wù)執(zhí)行失敗了,但并沒(méi)有影響 UserController 和 UserService 中的事務(wù)。

NESTED 使用演示

NESTED 是嵌套事務(wù)。

UserController 實(shí)現(xiàn)代碼如下:

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

UserService 實(shí)現(xiàn)代碼如下:

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

LogService 實(shí)現(xiàn)代碼如下:

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

最終執(zhí)行結(jié)果,用戶表和日志表都沒(méi)有添加任何數(shù)據(jù)。

執(zhí)行流程描述:

  • UserController 中調(diào)用了 UserService 的添加用戶方法,UserService 使用 NESTED 循環(huán)嵌套事務(wù),并成功執(zhí)行了添加用戶的方法。
  • UserService 中調(diào)用了 LogService 的添加方法,LogService 使用了 NESTED 循環(huán)嵌套事務(wù),但在方法執(zhí)行中出現(xiàn)的異常,因此回滾了當(dāng)前事務(wù)。
  • 因?yàn)?UserService 使用的是嵌套事務(wù),所以發(fā)生回滾的事務(wù)是全局的,也就是說(shuō) UserService 中的添加用戶方法也被回滾了,最終執(zhí)行結(jié)果是用戶表和日志表都沒(méi)有添加任何數(shù)據(jù)。

總結(jié)

Spring 事務(wù)傳播機(jī)制是包含多個(gè)事務(wù)的方法在相互調(diào)用時(shí),事務(wù)是如何在這些方法間傳播的。事務(wù)的傳播級(jí)別有 7 個(gè),支持當(dāng)前事務(wù)的:REQUIRED、SUPPORTS、MANDATORY;不支持當(dāng)前事務(wù)的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事務(wù) NESTED,其中 REQUIRED 是默認(rèn)的事務(wù)傳播級(jí)別。

以上就是深入了解Spring的事務(wù)傳播機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于Spring事務(wù)傳播機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot常用的請(qǐng)求參數(shù)的接收方式

    springboot常用的請(qǐng)求參數(shù)的接收方式

    在Spring?Boot中,接收請(qǐng)求參數(shù)的方式有多種,這篇文章主要為大家整理了9個(gè)常用的方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Java+opencv3.2.0實(shí)現(xiàn)重映射

    Java+opencv3.2.0實(shí)現(xiàn)重映射

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)重映射的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹(shù)狀菜單的方法

    Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹(shù)狀菜單的方法

    這篇文章主要介紹了Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹(shù)狀菜單,包括實(shí)體類中添加子菜單列表和集合及構(gòu)建菜單樹(shù)的詳細(xì)代碼,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2021-12-12
  • 詳解java中繼承關(guān)系類加載順序問(wèn)題

    詳解java中繼承關(guān)系類加載順序問(wèn)題

    這篇文章主要介紹了詳解java中繼承關(guān)系類加載順序問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java設(shè)計(jì)模式之適配器模式的示例詳解

    Java設(shè)計(jì)模式之適配器模式的示例詳解

    適配器模式,即將某個(gè)類的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口的表示,主要目的是實(shí)現(xiàn)兼容性,讓原本因?yàn)榻涌诓黄ヅ?,沒(méi)辦法一起工作的兩個(gè)類,可以協(xié)同工作。本文將通過(guò)示例詳細(xì)介紹適配器模式,需要的可以參考一下
    2022-02-02
  • Java有趣好玩的圖形界面開(kāi)發(fā)八個(gè)案例實(shí)現(xiàn)

    Java有趣好玩的圖形界面開(kāi)發(fā)八個(gè)案例實(shí)現(xiàn)

    今天使用GUI技術(shù)寫了幾個(gè)練習(xí)的Demo,希望對(duì)大家學(xué)習(xí)圖形用戶界面有所幫助,感興趣的同學(xué)來(lái)看看吧,動(dòng)手敲一遍理解更通透
    2022-05-05
  • 了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng)

    了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng)

    這篇文章主要介紹了了解java架構(gòu)之微服務(wù)架構(gòu)—雪崩效應(yīng),微服務(wù)化產(chǎn)品線,每一個(gè)服務(wù)專心于自己的業(yè)務(wù)邏輯,并對(duì)外提供相應(yīng)的接口,看上去似乎很明了,其實(shí)還有很多的東西需要考慮,,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)post請(qǐng)求詳細(xì)代碼(帶有參數(shù))

    Java實(shí)現(xiàn)post請(qǐng)求詳細(xì)代碼(帶有參數(shù))

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)帶有參數(shù)post請(qǐng)求的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-08-08
  • spring aop注解配置代碼實(shí)例

    spring aop注解配置代碼實(shí)例

    這篇文章主要介紹了spring aop注解配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式

    SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式

    這篇文章主要介紹了SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

晋宁县| 始兴县| 西充县| 梨树县| 永年县| 宁国市| 靖州| 乐清市| 安宁市| 长宁县| 新竹县| 卢湾区| 达拉特旗| 青龙| 平定县| 特克斯县| 南漳县| 响水县| 昌平区| 东阳市| 陈巴尔虎旗| 抚顺市| 延庆县| 聂拉木县| 凌海市| 隆德县| 莎车县| 新泰市| 靖安县| 皋兰县| 横山县| 武山县| 类乌齐县| 阿尔山市| 班戈县| 德庆县| 瑞昌市| 金川县| 涞源县| 柞水县| 舒城县|