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

SpringBoot與ShardingSphere整合,重構高并發庫存扣減場景的分布式事務模型

開發 前端
訂單創建和庫存扣減操作必須保證原子性,避免出現超賣或欠賣的情況,利用 ShardingSphere 的分布式事務管理功能,確保跨多個數據庫的操作具有一致性。

訂單創建和庫存扣減操作必須保證原子性,避免出現超賣或欠賣的情況,利用 ShardingSphere 的分布式事務管理功能,確保跨多個數據庫的操作具有一致性。

為什么選擇ShardingSphere?

  • XA 事務支持:ShardingSphere 提供了 XA 協議的支持,確保跨多個數據庫的操作具有強一致性,即使在分布式環境下也能保持數據的一致性。
  • 柔性事務:除了 XA 事務外,ShardingSphere 還支持柔性事務解決方案,如 Saga 和 BASE 模型,以適應不同的業務場景。
  • 動態添加/刪除數據源:可以在運行時動態地添加或刪除數據源,而無需重啟應用程序,提高了系統的靈活性和可維護性。
  • SQL 解析引擎:ShardingSphere 內置了強大的 SQL 解析引擎,能夠解析和改寫 SQL 語句,使其適用于分片后的數據庫結構。
  • 透明化訪問:通過標準的 JDBC 接口訪問分片后的數據庫,無需關心底層的數據分布情況。
  • 多種部署模式:ShardingSphere 支持多種部署模式,包括代理模式和嵌入式模式。
  • 容器化支持:支持 Docker 和 Kubernetes 等容器化平臺,便于自動化部署和管理。
  • 簡化開發:通過 Spring 的事務注解(如 @Transactional),開發者可以輕松地進行事務管理,無需手動編寫復雜的事務邏輯。
  • 集成 Atomikos:Atomikos 是一個成熟的事務管理器,與 ShardingSphere 結合使用可以提供可靠的分布式事務管理能力。
  • 靈活的分片策略:可以根據不同的業務需求選擇合適的分片算法(如 INLINERANGE 等),確保數據均勻分布并優化查詢性能。
  • 支持水平分片:ShardingSphere 支持將數據按一定的規則分散到多個數據庫實例中,從而實現水平擴展。這對于處理大規模訂單和產品數據非常有效。

代碼實操

<!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- Lombok (optional) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- ShardingSphere JDBC Core -->
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
        <version>5.1.2</version>
    </dependency>

    <!-- Atomikos Transaction Manager -->
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>transactions-jta</artifactId>
        <version>5.0.13</version>
    </dependency>

application.yml

server:
  port:8080

spring:
application:
    name:sharding-demo

# 數據庫配置
spring:
shardingsphere:
    datasource:
      names:ds0,ds1
      ds0:
        type:com.zaxxer.hikari.HikariDataSource
        driver-class-name:com.mysql.cj.jdbc.Driver
        jdbc-url:jdbc:mysql://localhost:3306/db0?useSSL=false&serverTimezone=UTC
        username:root
        password:root
      ds1:
        type:com.zaxxer.hikari.HikariDataSource
        driver-class-name:com.mysql.cj.jdbc.Driver
        jdbc-url:jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC
        username:root
        password:root
    rules:
      sharding:
        tables:
          t_product:
            actual-data-nodes:ds$->{0..1}.t_product_$->{0..1}
            table-strategy:
              standard:
                sharding-column:product_id
                sharding-algorithm-name:t_product_inline
            key-generate-strategy:
              column:product_id
              key-generator-name:snowflake
          t_order:
            actual-data-nodes:ds$->{0..1}.t_order_$->{0..1}
            table-strategy:
              standard:
                sharding-column:order_id
                sharding-algorithm-name:t_order_inline
            key-generate-strategy:
              column:order_id
              key-generator-name:snowflake
        binding-tables:
          -t_product,t_order
        sharding-algorithms:
          t_product_inline:
            type:INLINE
            props:
              algorithm-expression:t_product_$->{product_id%2}
          t_order_inline:
            type:INLINE
            props:
              algorithm-expression:t_order_$->{order_id%2}
        key-generators:
          snowflake:
            type:SNOWFLAKE
    props:
      sql-show:true

Product

package com.example.demo.entity;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Data
@Entity(name = "t_product")
publicclass Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long productId;
    private String productName;
    private Integer stock;
}

Order

package com.example.demo.entity;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Data
@Entity(name = "t_order")
publicclass Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderId;
    private Long productId;
    private Integer quantity;
}

Repository

package com.example.demo.repository;

import com.example.demo.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}

OrderRepository

package com.example.demo.repository;

import com.example.demo.entity.Order;
import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderRepository extends JpaRepository<Order, Long> {
}

Service

package com.example.demo.service;

import com.example.demo.entity.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
publicclass ProductService {

    @Autowired
    private ProductRepository productRepository;

    public Product getProductById(Long productId) {
        return productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));
    }

    public void updateStock(Long productId, int quantity) {
        Product product = getProductById(productId);
        product.setStock(product.getStock() - quantity);
        productRepository.save(product);
    }
}

OrderService

package com.example.demo.service;

import com.example.demo.entity.Order;
import com.example.demo.repository.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
publicclass OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private ProductService productService;

    @Transactional
    public void placeOrder(Long productId, int quantity) {
        // 檢查庫存
        if (!productService.getProductById(productId).getStock().equals(quantity)) {
            thrownew RuntimeException("Insufficient stock");
        }

        // 創建訂單
        Order order = new Order();
        order.setProductId(productId);
        order.setQuantity(quantity);
        orderRepository.save(order);

        // 扣減庫存
        productService.updateStock(productId, quantity);
    }
}

Controller

package com.example.demo.controller;

import com.example.demo.entity.Product;
import com.example.demo.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/products")
publicclass ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping("/{productId}")
    public Product getProduct(@PathVariable Long productId) {
        return productService.getProductById(productId);
    }

    @PostMapping("/")
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product);
    }
}

OrderController

package com.example.demo.controller;

import com.example.demo.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/orders")
publicclass OrderController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/place-order")
    public String placeOrder(@RequestParam Long productId, @RequestParam int quantity) {
        try {
            orderService.placeOrder(productId, quantity);
            return"Order placed successfully";
        } catch (Exception e) {
            return"Failed to place order: " + e.getMessage();
        }
    }
}

Application

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

測試

curl -X POST http://localhost:8080/orders/place-order \
     -d "productId=1&quantity=5"

Respons

Order placed successfully


責任編輯:武曉燕 來源: Java知識日歷
相關推薦

2022-06-27 08:21:05

Seata分布式事務微服務

2023-12-26 08:59:52

分布式場景事務機制

2024-09-10 10:42:27

2020-09-23 22:36:27

分布式架構系統

2022-06-21 08:27:22

Seata分布式事務

2021-02-01 09:35:53

關系型數據庫模型

2025-03-11 08:36:52

高并發場景性能

2022-01-10 11:58:51

SpringBootPulsar分布式

2017-12-12 14:51:15

分布式緩存設計

2021-08-26 08:24:33

高并發秒殺系統

2023-01-13 07:39:07

2020-09-03 06:33:35

高并發場景分布式鎖

2020-12-09 09:14:57

SpringCloudSeata 分布式

2020-10-13 07:44:45

理解分布式

2024-11-27 00:20:32

2017-07-26 15:08:05

大數據分布式事務

2021-04-16 16:02:13

SpringBoot分布式最大努力通知

2024-01-05 07:28:50

分布式事務框架
點贊
收藏

51CTO技術棧公眾號

国产乱码精品一区二区三区不卡| 欧美激情在线播放| 欧美国产综合在线| 在线观看欧美理论a影院| 色视频成人在线观看免| 潘金莲一级淫片aaaaaa播放1| 亚洲乱码一区| 69堂成人精品免费视频| 成人18免费| 国产激情视频一区二区在线观看 | 国产伦精品一区二区三区照片 | 国产欧美日韩专区发布| 日本韩国欧美| 日韩色视频在线观看| 欧美18一12sex性处hd| 成人深夜在线观看| 亚洲精品久久区二区三区蜜桃臀 | 久久精品香蕉视频| 狠狠色伊人亚洲综合成人| 99精品在线直播| 成人在线免费小视频| 久久久女女女女999久久| 亚洲一区二区三区四区| 亚洲高清一二三区| www在线视频| 欧美一区二区三区喷汁尤物| 国产二区三区在线| 9191精品国产综合久久久久久| 免费成人av电影| 欧美日韩中文另类| 50度灰在线| 日韩在线观看网站| 高清欧美日韩| 日韩中文字幕网站| 澳门成人av| 日韩美女写真福利在线观看| 免费看久久久| 999视频在线免费观看| 99青草视频在线播放视| 欧美不卡一区二区三区| 国模冰冰炮一区二区| 久久琪琪电影院| 久久福利影院| 亚洲午夜精品久久久中文影院av | 欧美一区三区四区| 亚洲男人av| 国产福利成人在线| 在线观看视频一区二区三区| 日韩高清一区二区| 国产精品白丝jk喷水视频一区| 久久国产精品区| 嫩草在线视频| 国产亚洲精品自在久久| 精品人伦一区二区三区蜜桃网站| 999精品在线| 在线黄色.com| 国产精品日韩高清| 欧美xingq一区二区| 成人精品一区二区三区四区 | 色偷偷9999www| 国产91丝袜在线播放0| 成人黄色视屏网站| 日本新janpanese乱熟| 欧美乱大交xxxxx| 日韩理论片在线| 日韩精品电影| 日韩毛片久久久| 日韩一二三区不卡在线视频| 永久555www成人免费| 欧美激情中文字幕一区二区| 综合伊思人在钱三区| 91av资源在线| 免费成人在线观看av| 亚洲自拍偷拍麻豆| 一区精品久久| 欧美久久久网站| 免费毛片在线| 青青草视频在线视频| 日韩美女视频免费看| 色偷偷久久人人79超碰人人澡| 欧美区国产区| 麻豆免费版在线观看| 国产a级片免费观看| 成人av资源在线播放| 欧美精品欧美精品系列| 波多野洁衣一区| 日韩av片子| 牛牛精品一区二区| 成年人视频观看| 国产精品丝袜视频| 精品美女在线播放| 久久综合九色综合久久久精品综合| 成人动漫一区| 自拍偷拍电影| 日韩手机在线观看视频| eeuss一区二区三区| 久久久av免费| 午夜伊人狠狠久久| 不卡视频免费播放| 在线欧美日韩| 在线观看国产精品入口| 一级在线观看| 色婷婷久久av| 在线观看一区日韩| 亚洲成在线观看| 亚洲精品国产第一综合99久久| 不卡在线视频中文字幕| 麻豆精品蜜桃视频网站| 天堂精品中文字幕在线| 国产精品自在在线| 久久精品日产第一区二区 | 91精品在线观| 国产成人综合av| 欧美一乱一性一交一视频| xxx一区二区| 精品亚洲一区二区三区在线观看 | 欧美激情乱人伦一区| 亚洲黄色av女优在线观看| 在线免费观看视频一区| 亚洲综合一区二区三区| 亚洲日本乱码在线观看| 亚洲人午夜精品天堂一二香蕉| 新67194成人永久网站| 91精品啪在线观看国产18| 成人影院天天5g天天爽无毒影院| 岛国成人av| 一本久久青青| 国产日产一区| 欧美精美视频| 色呦哟—国产精品| 天堂网在线观看国产精品| 欧美人与动xxxxz0oz| 国产成人在线中文字幕| 国产精品视频首页| 欧美高清hd| 伊人精品一区| 国产精品多人| 日日摸夜夜添夜夜添精品视频| 亚洲免费观看| 成人精品鲁一区一区二区| 精品一区二区三区蜜桃| 秋霞午夜鲁丝一区二区老狼| 成人精品免费网站| 婷婷丁香久久五月婷婷| 欧美一卡2卡三卡4卡5免费| 亚洲欧美国产精品专区久久| 日韩国产精品亚洲а∨天堂免| 亚洲丝袜在线视频| 国产mv久久久| 日韩欧美在线观看强乱免费| 99re99| 国产成人视屏| 狠狠色丁香婷综合久久| 欧美日韩成人在线| 97超碰蝌蚪网人人做人人爽| 亚洲黄色成人久久久| 亚洲成人影院在线观看| caoporn成人免费视频在线| 国产又黄又大久久| 亚洲精品一区二区精华| 99国内精品久久久久久久软件| 亚洲AV无码成人精品一区| 天天操天天干天天玩| 国产精彩免费视频| 国产性一级片| 中文字幕在线播放网址| 精品视频在线观看免费观看| 欧美男男freegayvideosroom| 亚洲午夜精品一区 二区 三区| 久久性天堂网| 最新中文字幕一区二区三区| 色婷婷综合久久久久中文| 亚洲欧美制服丝袜| 国产视频观看一区| 欧美一级特黄aaaaaa在线看片| 国产精美视频| 韩国精品主播一区二区在线观看 | 国产 高清 精品 在线 a| 国产欧美123| 两个人hd高清在线观看| av人人综合网| 好看的日韩av电影| 亚洲欧洲av色图| 亚洲欧美精品在线| 国产精品视频在线播放| 夜夜添无码一区二区三区| 色哟哟在线观看| 亚州一区二区| 国产在线一区二区综合免费视频| 欧美日韩中文字幕在线视频| 欧美激情视频给我| 一区二区三区四区国产| 日本电影全部在线观看网站视频| 欧美一级精品| 亚洲人妖av一区二区| 欧美剧在线观看| 精品国产一二三四区| 成人黄色免费短视频| 精品一区二区三区在线播放 | 永久在线免费观看|