成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

互聯網業務冪等性實現之基于MySQL

數據庫 其他數據庫
以某互聯網電商的取消訂單為例子,當訂單取消,需要返回給消費者下單所消費的虛擬產品,如優惠券、紅包、京豆等。通過冪等形式,確保返還給消費者的權益不多、不少。那冪等性具體開發是怎么實現的呢?本文帶來基于MySQL的UNIQUE KEY的實現方案。

背景

在互聯網業務領域中,我們經常會遇到應用到請求冪等性問題,即多次重復請求,所得到的結果,和一次請求一致。

以某互聯網電商的取消訂單為例子,當訂單取消,需要返回給消費者下單所消費的虛擬產品,如優惠券、紅包、京豆等。通過冪等形式,確保返還給消費者的權益不多、不少。

那冪等性具體開發是怎么實現的呢?本文帶來基于MySQL的UNIQUE KEY的實現方案。

實現

眾所周知,UNIQUE KEY是數據庫中的唯一索引,數據庫的記錄中不允許有重復的值,我們可以利用這點,在處理業務前,先進行唯一索引數據(如訂單id)的插入操作:

  • 插入成功,說明是第一次插入,正常處理業務;
  • 插入失敗,說明該業務邏輯已經處理過了,不做處理,提前返回;

如此,即可實現冪等性。

1.數據庫設計

冪等性輔助表設計如下:

CREATE TABLE `idempotent_validate` (
`id` bigint NOT NULL,
`create_time` time DEFAULT NULL,
`order_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_orssam7fgn4uj0lo2sn4on6vg` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

其中的一個字段order_id,我們定義為唯一索引。

2.代碼編寫

我們主要實現了訂單取消方法cancelOrder:

package com.example.idempotentmysql.service.impl;

import com.example.idempotentmysql.bean.IdempotentValidate;
import com.example.idempotentmysql.bean.OrderInfo;
import com.example.idempotentmysql.bean.ProductInfo;
import com.example.idempotentmysql.bean.UserInfo;
import com.example.idempotentmysql.repository.IdempotentValidateRepository;
import com.example.idempotentmysql.repository.OrderInfoRepository;
import com.example.idempotentmysql.repository.ProductInfoRepository;
import com.example.idempotentmysql.repository.UserInfoRepository;
import com.example.idempotentmysql.service.OrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Optional;

/**
* 訂單服務
*
* @author hongcunlin
*/
@Service
public class OrderServiceImpl implements OrderService {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);

/**
* 用戶repository
*/
@Resource
private UserInfoRepository userInfoRepository;

/**
* 商品repository
*/
@Resource
private ProductInfoRepository productInfoRepository;

/**
* 訂單repository
*/
@Resource
private OrderInfoRepository orderInfoRepository;

/**
* 冪等性校驗
*/
@Resource
private IdempotentValidateRepository idempotentValidateRepository;

/**
* 取消訂單(帶冪等性校驗)
*
* @param orderId 訂單id
*/
@Override
public void cancelOrder(Long orderId) {
// 1.冪等性校驗
try {
IdempotentValidate idempotentValidate = new IdempotentValidate();
idempotentValidate.setOrderId(orderId);
idempotentValidateRepository.save(idempotentValidate);
} catch (Exception e) {
LOGGER.info("訂單退款冪等");
return;
}

// 2.退款
Optional<OrderInfo> orderInfoOptional = orderInfoRepository.findById(orderId);
if (orderInfoOptional.isPresent()) {
OrderInfo orderInfo = orderInfoOptional.get();
Optional<UserInfo> userInfoOptional = userInfoRepository.findById(orderInfo.getUserId());
Optional<ProductInfo> productInfoOptional = productInfoRepository.findById(orderInfo.getProductId());
if (userInfoOptional.isPresent() && productInfoOptional.isPresent()) {
UserInfo userInfo = userInfoOptional.get();
ProductInfo productInfo = productInfoOptional.get();
userInfo.setMoney(userInfo.getMoney().add(productInfo.getPrice()));
userInfoRepository.save(userInfo);
}
}
LOGGER.info("訂單成功退款");
}
}

從代碼中可以看到,我們在除了訂單退款前,冪等性表先拿訂單id進行插入操作,若插入成功,說明是第一次取消訂單,執行下面的退款邏輯;

若插入失敗,說明之前已經進行過退款邏輯了,我們提前返回,不做下面的退款操作。

如此,便實現了訂單退款的冪等性。

3.測試

我們對訂單進行3次取消操作:

package com.example.idempotentmysql.service;


import com.example.idempotentmysql.bean.OrderInfo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class OrderServiceTest {

@Resource
private OrderService orderService;

@Test
public void cancelOrderTest() {
orderService.cancelOrder(6L);
orderService.cancelOrder(6L);
orderService.cancelOrder(6L);
}
}

可以看到,只有第一次是退款成功的,后面2次觸發冪等性,退款失敗,符合我們的預期。

其他

冪等性的實現方式還有很多種,基于MySQL的UNIQUE KEY的實現方案,實現起來相當簡單,僅適合業務簡單,并發量不高的場景。原因是MySQL的qps有限,且MySQL作為系統的最底層的應用,過于后置,如果最終冪等返回,比較浪費前置的業務處理所消耗的資源。

本文代碼已經上傳到github上了,有需要的同學可以下載參考:https://github.com/larger5/idempotent-mysql

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-11-01 09:28:02

2011-12-19 16:45:22

2022-07-26 09:03:50

冪等性數據狀態機

2015-06-24 15:35:54

2011-08-19 11:33:32

2015-09-09 14:24:14

2020-12-31 09:24:27

互聯網存款業務互聯網金融

2009-06-15 08:48:23

2014-10-11 09:16:59

互聯網協議

2015-05-28 16:11:07

互聯網+

2014-01-15 14:35:35

云計算

2025-03-17 08:07:11

2015-10-08 15:20:34

互聯網物聯網

2015-08-03 10:49:07

用友IUAP

2017-08-11 13:03:54

互聯網+工業轉型

2015-10-30 17:50:18

互聯網金融

2018-08-15 09:02:59

產業互聯網工業互聯網物聯網

2015-09-22 09:17:33

互聯網發展史

2023-12-05 15:49:29

2014-05-30 17:53:43

移動互聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久69 | 国产成人精品999在线观看 | 丝袜美腿一区二区三区 | 久久99网| 色综合视频在线 | 午夜精品一区二区三区在线视频 | 色婷婷综合久久久中字幕精品久久 | 欧美久久一级 | 国产精品国产三级国产aⅴ浪潮 | 日本免费一区二区三区四区 | 欧美激情精品久久久久久变态 | 男女视频91 | 麻豆精品国产免费 | 午夜精品一区二区三区在线视频 | 精品在线一区 | 色综合中文 | 精品国产欧美日韩不卡在线观看 | 亚州无限乱码 | av资源中文在线 | 在线视频一区二区 | 91麻豆精品国产91久久久久久久久 | 成人h视频在线 | 久久久久国产 | 欧美阿v| 综合久久久久久久 | 婷婷综合 | 国产99视频精品免视看9 | 欧美精品成人一区二区三区四区 | 一级做a爰片性色毛片 | 国产成人精品一区 | 亚洲高清视频一区二区 | 91免费观看国产 | 久久不卡| a在线视频观看 | 精品一区二区视频 | 中文字幕在线播放不卡 | 精品久久九九 | 成人免费视频网站在线看 | 国产成人亚洲精品自产在线 | 羞羞色视频 | 免费国产视频 |