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

Springcloud seata分布式事務(wù)實(shí)現(xiàn)代碼解析

 更新時(shí)間:2020年12月07日 14:47:40   作者:夢(mèng)澤千秋  
這篇文章主要介紹了Springcloud seata分布式事務(wù)實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Seata 是一款開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。本篇不涉及其原理,只用代碼構(gòu)建項(xiàng)目簡(jiǎn)單試用一下其回滾的機(jī)制。

大致上seata分為T(mén)C,TM,RM三大構(gòu)建成整體。它們之間的包含關(guān)系如下。即一(xid主鍵編碼,記錄信息)帶三(TC,TM,RM)

下面之間構(gòu)建項(xiàng)目進(jìn)行測(cè)試。

1.下載seata并解壓,然后改動(dòng)配置文件。

http://seata.io/zh-cn/blog/download.html官網(wǎng)下載。

解壓之后到conf中修改file和registry文件,修改之前一定記得先備份。

file.conf,改動(dòng)兩個(gè)地方

將group后面的參數(shù)定義一個(gè)名字,隨意

存儲(chǔ)方式選db放在數(shù)據(jù)庫(kù),自然其配置信息根據(jù)自己的數(shù)據(jù)庫(kù)去填寫(xiě)。

然后是register文件,填寫(xiě)信息將seata注冊(cè)到nacos中。

啟動(dòng)自然是在bin中打開(kāi)bat文件即可,注意需要先啟動(dòng)naco。

2.構(gòu)建項(xiàng)目(order,storage,account)

演示整體的服務(wù)調(diào)用還有服務(wù)報(bào)錯(cuò)的時(shí)候進(jìn)入回滾。通過(guò)創(chuàng)建訂單->檢查庫(kù)存并扣除->檢查賬戶(hù)并扣除->修改訂單狀態(tài)

具體代碼可查看GitHub

https://github.com/MaTsukun/springcloud2020

關(guān)鍵的service方法

@Service
@Slf4j
public class OrderServiceImpl implements OrderService{
  @Resource
  private OrderMapper orderMapper;
  @Resource
  private StorageService storageService;
  @Resource
  private AccountService accountService;

  @Override
  @GlobalTransactional(name="abc-create-order",rollbackFor = Exception.class)
  public void create(Order order){
    //1.創(chuàng)建訂單
    log.info("開(kāi)始創(chuàng)建訂單");
    orderMapper.create(order);
    //2.減少庫(kù)存
    log.info("查詢(xún)庫(kù)存并且進(jìn)行更改");
    storageService.decrease(order.getProductId(),order.getCount());
    //3.扣除費(fèi)用
    log.info("查詢(xún)余額并扣除費(fèi)用");
    accountService.updateAccount(order.getUserId(),order.getMoney());
    //4.修改狀態(tài)
    log.info("更改訂單狀態(tài)");
    orderMapper.update(order.getUserId(),0);
    log.info("訂單結(jié)束,O(∩_∩)O哈哈~");
  }
}

可以看到在order項(xiàng)目中同時(shí)調(diào)用了storage和account的項(xiàng)目的方法,采用的是openfeign,整體形成了一個(gè)鏈路,成為一個(gè)整的事務(wù)。

而添加的GlobalTransactional注解則保證了事務(wù)中任何一方出現(xiàn)錯(cuò)誤就會(huì)使整個(gè)項(xiàng)目的執(zhí)行過(guò)程進(jìn)行回滾,而不是單事務(wù)的回滾。

3.seata回滾原理

在每次注解的方法里進(jìn)行執(zhí)行sql語(yǔ)句的時(shí)候都會(huì)創(chuàng)建一個(gè)id記錄此次的寫(xiě)操作同時(shí)在每次的寫(xiě)操作前后都會(huì)生成前置記錄和后置記錄,可以在出現(xiàn)錯(cuò)誤回滾的時(shí)候,通過(guò)記錄進(jìn)行逆操作回滾重新將數(shù)據(jù)寫(xiě)回去。

通過(guò)數(shù)據(jù)庫(kù)配置的seata庫(kù)展示可以看見(jiàn)對(duì)應(yīng)的記錄id信息,通過(guò)debug模式暫停服務(wù),查看記錄的信息。

global的全局xid

account表的undo記錄

記錄的信息json格式

{
  "@class": "io.seata.rm.datasource.undo.BranchUndoLog", 
  "xid": "192.168.2.141:8091:2060193863", 
  "branchId": 2060193875, 
  "sqlUndoLogs": [
    "java.util.ArrayList", 
    [
      {
        "@class": "io.seata.rm.datasource.undo.SQLUndoLog", 
        "sqlType": "UPDATE", 
        "tableName": "t_account", 
        "beforeImage": {
          "@class": "io.seata.rm.datasource.sql.struct.TableRecords", 
          "tableName": "t_account", 
          "rows": [
            "java.util.ArrayList", 
            [
              {
                "@class": "io.seata.rm.datasource.sql.struct.Row", 
                "fields": [
                  "java.util.ArrayList", 
                  [
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "id", 
                      "keyType": "PrimaryKey", 
                      "type": -5, 
                      "value": [
                        "java.lang.Long", 
                        1
                      ]
                    }, 
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "used", 
                      "keyType": "NULL", 
                      "type": 3, 
                      "value": [
                        "java.math.BigDecimal", 
                        600
                      ]
                    }, 
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "residue", 
                      "keyType": "NULL", 
                      "type": 3, 
                      "value": [
                        "java.math.BigDecimal", 
                        400
                      ]
                    }
                  ]
                ]
              }
            ]
          ]
        }, 
        "afterImage": {
          "@class": "io.seata.rm.datasource.sql.struct.TableRecords", 
          "tableName": "t_account", 
          "rows": [
            "java.util.ArrayList", 
            [
              {
                "@class": "io.seata.rm.datasource.sql.struct.Row", 
                "fields": [
                  "java.util.ArrayList", 
                  [
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "id", 
                      "keyType": "PrimaryKey", 
                      "type": -5, 
                      "value": [
                        "java.lang.Long", 
                        1
                      ]
                    }, 
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "used", 
                      "keyType": "NULL", 
                      "type": 3, 
                      "value": [
                        "java.math.BigDecimal", 
                        700
                      ]
                    }, 
                    {
                      "@class": "io.seata.rm.datasource.sql.struct.Field", 
                      "name": "residue", 
                      "keyType": "NULL", 
                      "type": 3, 
                      "value": [
                        "java.math.BigDecimal", 
                        300
                      ]
                    }
                  ]
                ]
              }
            ]
          ]
        }
      }
    ]
  ]
}

可以看到里面有beforeimage和afterimage快照記錄,通過(guò)這些記錄可以實(shí)現(xiàn)逆操作,重新寫(xiě)進(jìn)數(shù)據(jù)實(shí)現(xiàn)回滾。

本文只是簡(jiǎn)單的配置,后續(xù)會(huì)進(jìn)行詳細(xì)補(bǔ)充。

所有的代碼都在GitHub

https://github.com/MaTsukun/springcloud2020

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis-Plus-AutoGenerator 最詳細(xì)使用方法

    Mybatis-Plus-AutoGenerator 最詳細(xì)使用方法

    這篇文章主要介紹了Mybatis-Plus-AutoGenerator 最詳細(xì)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 基于Java實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    基于Java實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫(xiě)一個(gè)簡(jiǎn)單的音樂(lè)播放器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • SpringCloud微服務(wù)應(yīng)用config配置中心詳解

    SpringCloud微服務(wù)應(yīng)用config配置中心詳解

    這篇文章主要介紹了SpringCloud微服務(wù)應(yīng)用-config配置中心,包括相關(guān)知識(shí)介紹、搭建、動(dòng)態(tài)刷新、測(cè)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Unity2019-2020 個(gè)人版官方免費(fèi)激活詳細(xì)方法

    Unity2019-2020 個(gè)人版官方免費(fèi)激活詳細(xì)方法

    這篇文章主要介紹了Unity2019-2020 個(gè)人版官方免費(fèi)激活詳細(xì)方法,激活方法分位兩種一種是激活新許可證,一種是手動(dòng)激活,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • Java線(xiàn)程同步方法實(shí)例總結(jié)

    Java線(xiàn)程同步方法實(shí)例總結(jié)

    這篇文章主要介紹了Java線(xiàn)程同步方法,結(jié)合實(shí)例形式總結(jié)分析了Java線(xiàn)程同步、并發(fā)控制相關(guān)實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式

    Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式

    這篇文章主要介紹了Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 淺析JVM垃圾回收的過(guò)程

    淺析JVM垃圾回收的過(guò)程

    這篇文章主要介紹了JVM垃圾回收的過(guò)程,幫助大家更好的理解和學(xué)習(xí)Java中的垃圾回收機(jī)制,感興趣的朋友可以了解下
    2020-09-09
  • 后端java壓縮圖片超詳細(xì)圖文教程

    后端java壓縮圖片超詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于后端java壓縮圖片的相關(guān)資料,片壓縮是一種廣泛采用的技術(shù),它不僅能顯著減小文件大小,釋放更多存儲(chǔ)空間,還能提升圖片加載速度,避免長(zhǎng)時(shí)間等待,需要的朋友可以參考下
    2024-04-04
  • 使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值

    使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值

    這篇文章主要介紹了使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java參數(shù)傳值代碼舉例

    java參數(shù)傳值代碼舉例

    在編程中往方法中傳遞參數(shù)的方法往往有兩種,一種是值傳遞,一種是引用傳遞,而在java中所有的參數(shù)傳遞全部都是值傳遞,這篇文章主要給大家介紹了關(guān)于java參數(shù)傳值的相關(guān)資料,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

山丹县| 竹山县| 嘉兴市| 惠东县| 娄烦县| 紫金县| 凤庆县| 焉耆| 雷山县| 泰兴市| 五指山市| 邛崃市| 普兰店市| 安乡县| 盐津县| 永泰县| 息烽县| 文山县| 西平县| 桐柏县| 石景山区| 莫力| 锦州市| 遵化市| 阿鲁科尔沁旗| 广灵县| 新闻| 中阳县| 墨脱县| 黔西县| 上思县| 深圳市| 余江县| 白河县| 天柱县| 太和县| 从化市| 大竹县| 宁都县| 安吉县| 商河县|