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

如何在 Spring Boot 中集成 Seata,解決分布式事務(wù)?

云計算 分布式
本文將詳細(xì)介紹如何在 Spring Boot 項目中集成 Seata,并通過具體的代碼案例實現(xiàn)分布式事務(wù)管理。以下內(nèi)容包括配置、代碼實現(xiàn)以及一些注意事項,幫助你快速上手。

在分布式系統(tǒng)中,服務(wù)之間往往涉及多個數(shù)據(jù)庫操作,這就需要一個可靠的分布式事務(wù)解決方案來確保數(shù)據(jù)的一致性。Seata(Simple Extensible Autonomous Transaction Architecture)是一個開源的分布式事務(wù)解決方案,提供了高性能和易用的分布式事務(wù)服務(wù)。

本文將詳細(xì)介紹如何在 Spring Boot 項目中集成 Seata,并通過具體的代碼案例實現(xiàn)分布式事務(wù)管理。以下內(nèi)容包括配置、代碼實現(xiàn)以及一些注意事項,幫助你快速上手。

整體步驟

1、準(zhǔn)備工作:

  • 搭建 Seata Server 環(huán)境
  • 創(chuàng)建兩個模擬服務(wù) order-service 和 account-service,分別代表訂單和賬戶的服務(wù)
  • 準(zhǔn)備一個 Eureka/Nacos 注冊中心(推薦 Nacos)

2、配置 Seata:

  • 在項目中引入 Seata 依賴
  • 配置 Seata 客戶端
  • 配置數(shù)據(jù)源代理

3、代碼實現(xiàn):

  • 使用 @GlobalTransactional 注解實現(xiàn)全局事務(wù)管理
  • 編寫業(yè)務(wù)邏輯和分布式事務(wù)示例

環(huán)境搭建

1、下載并啟動 Seata Server

從 Seata 官方倉庫下載 Seata Server:https://github.com/seata/seata/releases。解壓后,修改 conf/registry.conf 文件,將注冊中心改為 Nacos:

registry {
  type = "nacos"

  nacos {
    serverAddr = "localhost:8848"  # Nacos 服務(wù)地址
    namespace = ""                 # Nacos 命名空間
    cluster = "default"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "localhost:8848"
    namespace = ""
    group = "SEATA_GROUP"
  }
}

啟動 Seata Server:

sh bin/seata-server.sh

依賴引入

在兩個 Spring Boot 項目中添加以下依賴:

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2021.0.4.0</version>
</dependency>

配置文件詳解

以下是 application.yml 配置文件示例(order-service 和 account-service 的配置基本相同,區(qū)別僅在服務(wù)名上)。

order-service 配置

server:
  port: 8081

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml

seata:
  enabled: true
  tx-service-group: my_tx_group  # 事務(wù)組名,與 Seata Server 配置一致

account-service 配置

server:
  port: 8082

spring:
  application:
    name: account-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/account_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml

seata:
  enabled: true
  tx-service-group: my_tx_group  # 事務(wù)組名

數(shù)據(jù)庫表設(shè)計

訂單表 order_tbl

CREATE TABLE order_tbl (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id VARCHAR(64) NOT NULL,
  product_id VARCHAR(64) NOT NULL,
  count INT NOT NULL,
  money DECIMAL(10,2) NOT NULL,
  status INT DEFAULT 0 COMMENT '0:待支付, 1:已支付'
);

賬戶表 account_tbl

CREATE TABLE account_tbl (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id VARCHAR(64) NOT NULL,
  total DECIMAL(10,2) NOT NULL,
  used DECIMAL(10,2) NOT NULL,
  residue DECIMAL(10,2) NOT NULL
);

核心代碼實現(xiàn)

1、全局事務(wù)注解

Seata 提供了 @GlobalTransactional 注解,用于在分布式事務(wù)中管理多個服務(wù)調(diào)用。

2、OrderService 示例

OrderService 中模擬訂單創(chuàng)建邏輯,同時調(diào)用 AccountService 扣減賬戶余額。

代碼實現(xiàn)
@Service
@Slf4j
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private AccountClient accountClient; // Feign 客戶端調(diào)用 AccountService

    @GlobalTransactional(name = "create-order-transaction", rollbackFor = Exception.class)
    public void createOrder(String userId, String productId, int count, BigDecimal money) {
        log.info("-----> 開始新建訂單");
        Order order = new Order();
        order.setUserId(userId);
        order.setProductId(productId);
        order.setCount(count);
        order.setMoney(money);
        order.setStatus(0);
        orderMapper.insert(order);

        log.info("-----> 訂單服務(wù)調(diào)用賬戶,開始扣減余額");
        accountClient.decreaseAccount(userId, money);
        log.info("-----> 訂單服務(wù)調(diào)用賬戶,扣減余額完成");

        log.info("-----> 修改訂單狀態(tài)為已完成");
        order.setStatus(1);
        orderMapper.updateById(order);

        log.info("-----> 訂單處理結(jié)束");
    }
}
Mapper 層
@Mapper
public interface OrderMapper extends BaseMapper<Order> {}

3、AccountService 示例

AccountService 中實現(xiàn)賬戶余額的扣減邏輯。

代碼實現(xiàn)
@Service
@Slf4j
public class AccountService {

    @Autowired
    private AccountMapper accountMapper;

    public void decreaseAccount(String userId, BigDecimal money) {
        log.info("-----> 扣減賬戶余額開始");
        accountMapper.decrease(userId, money);
        log.info("-----> 扣減賬戶余額結(jié)束");
    }
}
Mapper 層
@Mapper
public interface AccountMapper {

    @Update("UPDATE account_tbl SET residue = residue - #{money}, used = used + #{money} WHERE user_id = #{userId}")
    void decrease(@Param("userId") String userId, @Param("money") BigDecimal money);
}

4、Feign Client 示例

@FeignClient(name = "account-service")
public interface AccountClient {

    @PostMapping("/account/decrease")
    void decreaseAccount(@RequestParam("userId") String userId, @RequestParam("money") BigDecimal money);
}

測試分布式事務(wù)

啟動服務(wù)后,通過 Postman 或其他工具發(fā)送請求:

curl -X POST http://localhost:8081/order/create \
     -H "Content-Type: application/json" \
     -d '{
           "userId": "1",
           "productId": "1",
           "count": 10,
           "money": 100.00
         }'

重要注意事項

1、Seata Undo Log 表: 在每個數(shù)據(jù)庫中創(chuàng)建 undo_log 表,供 Seata 記錄回滾日志。

CREATE TABLE undo_log (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    branch_id BIGINT NOT NULL,
    xid VARCHAR(128) NOT NULL,
    context VARCHAR(128) NOT NULL,
    rollback_info LONGBLOB NOT NULL,
    log_status INT NOT NULL,
    log_created DATETIME NOT NULL,
    log_modified DATETIME NOT NULL,
    UNIQUE KEY ux_undo_log (xid, branch_id)
);

2、Seata 配置中心: 確保 Seata Server 的配置與服務(wù)端一致,事務(wù)組名必須統(tǒng)一。

總結(jié)

通過以上配置和代碼示例,我們實現(xiàn)了基于 Seata 的分布式事務(wù)管理。在實際項目中,可以根據(jù)業(yè)務(wù)需求靈活調(diào)整服務(wù)和表設(shè)計,確保數(shù)據(jù)一致性。

如果需要更深入的優(yōu)化或其他集成方法,可以進(jìn)一步研究 Seata 的 AT、TCC 模式以及高可用配置。

責(zé)任編輯:武曉燕 來源: 架構(gòu)師秋天
相關(guān)推薦

2022-03-24 07:51:27

seata分布式事務(wù)Java

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2024-10-09 14:14:07

2025-04-30 10:44:02

2022-06-21 08:27:22

Seata分布式事務(wù)

2025-04-28 00:44:04

2020-12-09 09:14:57

SpringCloudSeata 分布式

2022-07-10 20:24:48

Seata分布式事務(wù)

2020-12-08 11:43:03

Spring Clou分布式Seata

2025-05-07 00:10:00

分布式事務(wù)TCC模式

2025-08-27 09:11:48

2021-04-23 08:15:51

Seata XA AT

2023-11-06 13:15:32

分布式事務(wù)Seata

2022-06-14 10:47:00

分布式事務(wù)數(shù)據(jù)

2024-08-19 09:05:00

Seata分布式事務(wù)

2020-04-28 12:18:08

Seata模式分布式

2022-01-12 10:02:02

TCC模式 Seata

2023-01-06 09:19:12

Seata分布式事務(wù)

2022-07-03 14:03:57

分布式Seata

2020-05-28 09:35:05

分布式事務(wù)方案
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲网友自拍偷拍| 激情亚洲影院在线观看| 欧美亚洲国产激情| 欧美一区二区成人6969| 成年人网站大全| 国产欧美亚洲精品a| 欧美一级艳片视频免费观看| 116极品美女午夜一级| 91九色在线观看| 激情六月丁香婷婷| 久久久xxx| 国产成人精彩在线视频九色| 欧美aa一级| 欧美色国产精品| 波多野结衣在线中文| 成年人网站91| 四虎永久国产精品| 欧美日韩91| 国产精品黄页免费高清在线观看| 四虎视频在线精品免费网址| 欧美精品一区二区三区蜜桃| 国产视频三级在线观看播放| 亚洲精品国久久99热| 国产精彩免费视频| 成人成人成人在线视频| 亚洲图色在线| 久久精品人人做人人爽电影蜜月| 3d动漫啪啪精品一区二区免费| 日本欧美韩国国产| 欧美激情va永久在线播放| 成人美女视频| 精品福利视频一区二区三区| 国产黄a三级三级三级av在线看 | 久久精品国产一区| 欧美特黄aaaaaaaa大片| 欧美一区二区三区四区五区| 成人午夜电影在线观看| 五月开心婷婷久久| 在线免费激情视频| 欧美色xxxx| 番号在线播放| 欧美喷潮久久久xxxxx| 免费看美女视频在线网站| 欧美在线你懂的| 国产精品一级伦理| 91精品国产综合久久福利| 自拍亚洲图区| 欧美精品一区二区三区很污很色的 | 人人精品久久| 精品网站999www| 超碰99在线| 国产一区二区三区在线| 免费成人毛片| 国模吧一区二区| 久久99免费视频| 成人xxxx视频| 国产欧美日本| 亚洲一区综合| 99久久精品免费精品国产| 激情网站五月天| 亚洲精品美国一| jizz在线观看| 亚洲人成在线观看网站高清| 国产麻豆一区二区三区| 国产盗摄xxxx视频xxx69| 欧美在线三级| 亚洲国产精品一区二区第一页| 丁香亚洲综合激情啪啪综合| 在线看的黄色网址| 日韩欧美精品中文字幕| 激情网站在线| 欧美极品在线播放| 午夜精品久久99蜜桃的功能介绍| 日韩经典在线视频| 国产白丝精品91爽爽久久| 亚州av影院| 欧美丝袜丝nylons| 国产精品66| 国产精品精品视频| 老鸭窝91久久精品色噜噜导演| 欧美 日韩 国产 在线观看| 国产午夜精品一区二区三区视频| 羞羞视频网站在线观看| 亚洲色图第一页| 成人在线电影在线观看视频| 伊人情人网综合| 成人免费在线观看入口| 麻豆电影在线播放| 欧美黄色免费网站| 亚洲另类黄色| 国产视频1区2区3区| 欧美日韩国产电影| 日韩中文字幕在线一区| 99精品国产高清在线观看| 国产成人精品免费网站| 亚洲大胆精品| 久久躁狠狠躁夜夜爽| 99国产精品99久久久久久粉嫩| 成人一级片网站| 欧美一区二区日韩一区二区| 久久精品论坛| 亚洲欧美一二三| 色婷婷亚洲精品| 日本久久伊人| 在线视频不卡一区二区| 狠狠综合久久av一区二区小说| 成人在线中文| 欧美大香线蕉线伊人久久国产精品 | 久久久久久久久久久国产| 伊人成人网在线看| 久草福利视频在线| 日韩一级黄色片| 一区二区三区韩国免费中文网站| 中文字幕欧美日韩一区二区| 一本在线高清不卡dvd| 精品中文在线| 一区二区免费在线视频| 狠狠躁夜夜躁久久躁别揉| 伊人久久亚洲| 中文字幕精品一区日韩| 91久久精品网| 亚洲人成伊人成综合图片| 久久国产精品免费观看| 欧美日韩在线综合| 欧美理论电影大全| 另类小说色综合| 欲色天天网综合久久| 99成人精品| 男人天堂网在线观看| 国产va免费精品高清在线| 91色乱码一区二区三区| 日韩大尺度黄色| 亚洲欧美丝袜| 欧美一级片在线观看| 欧美人与禽猛交乱配视频| 大地资源高清播放在线观看| 国内免费久久久久久久久久久 | 免费在线亚洲| 日韩a在线观看| 国产精品久久91| 18成人在线观看| 国产一区二区三区免费观看在线| 91手机视频在线| 精品福利一二区| 老妇喷水一区二区三区| 超碰caoporn久久| 久久国产精品一区二区三区四区 | 久久久免费毛片| 国产91对白刺激露脸在线观看| 日韩电影中文字幕av| 手机看片福利永久国产日韩| 偷拍亚洲欧洲综合| 免费不卡中文字幕在线| jizz欧美性11| 毛片精品免费在线观看| 99久久久国产精品| 日韩精品第二页| 内射国产内射夫妻免费频道| 日韩最新免费不卡| 久久久久久久综合| 91麻豆精品激情在线观看最新| 国产视频一区二区三区在线播放 | 97视频在线观看网站| 成人综合色站| 欧美日韩黄色一区二区| 亚洲欧美日韩国产| 国产网站在线免费观看| 日本成人黄色免费看| 日韩电影网在线| av不卡在线观看| 国产乱论精品| 午夜成在线www| 91成人免费看| 4438x亚洲最大成人网| 三级一区在线视频先锋| 成人欧美大片| 国产精品亚洲αv天堂无码| 91国自产精品中文字幕亚洲| 亚洲国产精品一区二区www在线| 亚洲欧美网站在线观看| 黄色在线视频网站| 欧美一区二区三区综合| 久久6免费高清热精品| 亚洲制服丝袜av| 国产精品三上| 色偷偷色偷偷色偷偷在线视频| 91成人在线观看喷潮教学| 久久久久久久999精品视频| 亚洲国产成人porn| 日韩亚洲精品在线| 欧美与亚洲与日本直播| 大香一本蕉伊线亚洲网| 91在线播放视频| 亚洲品质视频自拍网| 国产精品久久久久久久岛一牛影视| 欧美电影免费观看高清| wwwav在线| 国产嫩草在线观看| 国产精品久久国产精品| 国产亚洲欧美日韩精品|