【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

👉 点击关注不迷路

👉 点击关注不迷路

👉 点击关注不迷路


文章大纲

  • [8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践](#8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践)
    • [1. 成本构成分析与优化机会识别](#1. 成本构成分析与优化机会识别)
      • [1.1 Serverless模式成本分布](#1.1 Serverless模式成本分布)
      • [1.2 冷热数据特征分析](#1.2 冷热数据特征分析)
    • [2. 冷热数据分离技术实现](#2. 冷热数据分离技术实现)
      • [2.1 生命周期管理策略](#2.1 生命周期管理策略)
      • [2.2 索引分片优化方案](#2.2 索引分片优化方案)
    • [3. 成本优化策略矩阵](#3. 成本优化策略矩阵)
      • [3.1 存储成本优化](#3.1 存储成本优化)
      • [3.2 计算成本优化](#3.2 计算成本优化)
      • [3.3 综合优化效果预测](#3.3 综合优化效果预测)
    • [4. 企业级优化案例](#4. 企业级优化案例)
      • [4.1 电商日志分析场景](#4.1 电商日志分析场景)
      • [4.2 物联网时序数据场景](#4.2 物联网时序数据场景)
    • [5. 自动化成本管控](#5. 自动化成本管控)
      • [5.1 基于`AI`的成本预测](#5.1 基于AI的成本预测)
      • [5.2 预算告警与自动治理](#5.2 预算告警与自动治理)
    • [6. 工具链与监控体系](#6. 工具链与监控体系)
      • [6.1 AWS原生工具栈](#6.1 AWS原生工具栈)
      • [6.2 自定义监控看板](#6.2 自定义监控看板)
    • [7. 未来演进方向](#7. 未来演进方向)
      • [7.1 `智能分层技术`](#7.1 智能分层技术)
      • [7.2 边缘计算协同](#7.2 边缘计算协同)

8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践

成本优化与冷热数据分离架构 数据摄入层 冷热分层策略 存储优化层 查询路由层 生命周期管理 监控与成本优化 Kinesis Firehose实时摄入 Lambda数据预处理 基于时间/访问频率的冷热标签 OpenSearch ILM策略 热数据驻留SSD 冷数据迁移至S3/Glacier Serverless Collection隔离 查询自动路由热数据 冷数据通过SQL/REST访问 自动索引滚动 冷数据归档与删除 CloudWatch监控OCU消耗 Cost Explorer分析成本 预留OCU节省30%-50%

  • 流程图说明:

    • 数据摄入层
      • 使用 Kinesis Firehose 实时采集日志 / 指标数据
      • 通过 Lambda 进行数据清洗、格式转换和冷热标签标注
    • 冷热分层策略
      • 基于时间戳(如 7 天内为热数据)或访问频率(如近 30 天查询量)打标签
      • 利用 OpenSearch 索引生命周期管理(ILM)自动执行冷热迁移
    • 存储优化层
      • 热数据存储于 OpenSearch Serverless SSD
      • 冷数据通过 S3 集成或直接迁移至 Glacier
      • 按业务维度创建独立的 Serverless Collection
    • 查询路由层
      • 热数据查询直接命中内存缓存
      • 冷数据通过 SQL 接口或 REST API 访问 S3 归档
    • 生命周期管理
      • 自动滚动索引(如每天创建新索引)
      • 冷数据归档后定期删除原始数据
    • 监控与成本优化
      • 监控 OCU 使用量和存储成本
      • 通过预留 OCU 和按需计费组合降低成本
      • 分析历史成本趋势优化策略
  • Cost Explorer 深度解析与实战指南

    • 核心功能与架构

Cost Explorer核心功能 成本趋势分析 成本分配标签 预留实例建议 成本预测 AWS服务对比 每日/月度成本曲线 成本异常波动检测 按标签过滤(如环境/业务线) 自定义成本分配规则 RI/Savings Plan优化建议 未充分利用资源警示 未来30天成本预测 预留实例ROI分析 各服务成本占比 跨区域成本对比

  • 冷热分离场景操作指南-关键分析维度

    • 冷热数据成本构成

      handlebars 复制代码
      热数据成本 = OCU费用(实时计算) + SSD存储费用
      
      冷数据成本 = S3标准存储(30天内) + S3 Glacier(长期归档)
    • 查询路由成本追踪

    • 监控仪表盘建议

    指标 阈值范围 监控频率
    OCU利用率 >80% 5分钟
    冷数据查询延迟 >500ms 1小时
    存储成本环比增长 >15% 每日
    预留实例覆盖率 <70% 每周

1. 成本构成分析与优化机会识别

1.1 Serverless模式成本分布

成本类型 占比 计费模型 优化潜力点
计算资源 65% $0.48/OCU小时 自动缩容/查询优化
热数据存储 22% $0.023/GB/月 冷热分层/压缩算法
冷数据存储 8% $0.012/GB/月 生命周期管理
数据传输 5% $0.01/GB(跨AZ) 流量调度优化

行业数据:合理实施冷热分层可降低存储成本58%,整体成本节省27%-35%

1.2 冷热数据特征分析

>10次/天 1-10次/天 <1次/天 7天 30天 1年+ 数据温度 访问频率 热数据 温数据 冷数据 保留策略

数据特征矩阵
维度 热数据 温数据 冷数据
访问频率 >100次/天 1-10次/天 <1次/周
延迟敏感度 <100ms <500ms <2s
存储成本 $0.023/GB $0.015/GB $0.012/GB
典型场景 实时监控/搜索 周报生成/审计 合规归档/历史分析

2. 冷热数据分离技术实现

2.1 生命周期管理策略

handlebars 复制代码
# 定义一个 AWS OpenSearch Serverless 的生命周期策略资源,名称为 hot_cold
resource "aws_opensearchserverless_lifecycle_policy" "hot_cold" {
  # 生命周期策略的名称,这里设置为 hot-warm-cold-policy
  name        = "hot-warm-cold-policy"
  
  # 对该生命周期策略的描述,说明这是一个用于冷热数据分层的策略
  description = "冷热数据分层策略"

  # 定义生命周期策略的具体内容,使用 jsonencode 函数将 JSON 格式的策略转换为字符串
  policy = jsonencode({
    # 策略中包含多个规则,使用 Rules 数组来定义
    "Rules" : [
      {
        # 规则的名称,用于标识该规则,这里表示将热数据转换为温数据的规则
        "Name" : "HotToWarm",
        
        # 规则触发的条件
        "Conditions" : {
          # 数据的年龄条件,当数据的年龄达到 7 天,单位为天
          "Age" : { "Value" : 7, "Unit" : "DAYS" },
          
          # 文档数量条件,当索引中的文档数量达到 1000000 个
          "DocCount" : { "Value" : 1000000 }
        },
        # 当满足上述条件时要执行的操作
        "Actions" : {
          # 操作类型为 TRANSITION,表示数据层的转换
          "Type" : "TRANSITION",
          
          # 转换的目标层为 WARM,即将数据从热数据层转换到温数据层
          "Target" : "WARM"
        }
      },
      {
        # 规则的名称,用于标识该规则,这里表示将温数据转换为冷数据的规则
        "Name" : "WarmToCold",
        
        # 规则触发的条件
        "Conditions" : {
          # 数据的年龄条件,当数据的年龄达到 30 天,单位为天
          "Age" : { "Value" : 30, "Unit" : "DAYS" }
        },
        
        # 当满足上述条件时要执行的操作
        "Actions" : {
          # 操作类型为 TRANSITION,表示数据层的转换
          "Type" : "TRANSITION",
          
          # 转换的目标层为 COLD,即将数据从温数据层转换到冷数据层
          "Target" : "COLD"
        }
      },
      {
        # 规则的名称,用于标识该规则,这里表示删除冷数据的规则
        "Name" : "DeleteCold",
        
        # 规则触发的条件
        "Conditions" : {
          
          # 数据的年龄条件,当数据的年龄达到 365 天,单位为天
          "Age" : { "Value" : 365, "Unit" : "DAYS" }
        },
        # 当满足上述条件时要执行的操作
        "Actions" : {
          
          # 操作类型为 DELETE,表示删除数据
          "Type" : "DELETE"
        }
      }
    ]
  })
}
策略效果验证
策略阶段 数据量 存储成本/月 查询延迟 存储压缩率
热数据(7天) 500GB $11.5 85ms 1.5:1
温数据(30天) 2TB $30 220ms 3:1
冷数据(1年) 10TB $120 650ms 5:1

2.2 索引分片优化方案

json 复制代码
// 向 _serverless/settings 端点发送 PUT 请求,用于配置 OpenSearch Serverless 的索引设置
PUT _serverless/settings
{
    "index": {
        // 配置不同数据层(热、温、冷)的索引分片数量
        "number_of_shards": {
            // 热数据层的索引分片数量设置为 6
            // 热数据通常是频繁访问的数据,较多的分片可以提高读写性能,因为可以并行处理更多的请求
            "hot": 6,
            
            // 温数据层的索引分片数量设置为 3
            // 温数据的访问频率相对热数据较低,所以可以适当减少分片数量以节省资源
            "warm": 3,
            
            // 冷数据层的索引分片数量设置为 1
            // 冷数据很少被访问,使用较少的分片可以降低存储和管理成本
            "cold": 1
        },
        // 配置不同数据层(热、温、冷)的索引压缩编解码器
        "codec": {
            // 热数据层使用 ZSTD 编解码器
            // ZSTD 编解码器在压缩比和压缩/解压缩速度之间取得了较好的平衡,适合热数据频繁读写的场景
            "hot": "ZSTD",
            // 温数据层同样使用 ZSTD 编解码器
            // 考虑到温数据的读写频率和存储需求,ZSTD 仍然是一个合适的选择
            "warm": "ZSTD",
            // 冷数据层使用 BEST_COMPRESSION 编解码器
            // 冷数据很少被访问,更注重压缩比以节省存储空间,BEST_COMPRESSION 可以提供更高的压缩率
            "cold": "BEST_COMPRESSION"
        },
        // 配置索引的路由分配规则
        "routing": {
            "allocation": {
                "include": {
                    // 要求索引的数据必须分配到具有 "hot_content" 数据层属性的节点上
                    // 这有助于将索引数据集中在特定类型的节点上,以满足不同数据层的性能和存储要求
                    "data_tier": "hot_content"
                }
            }
        }
    }
}
  • 分片配置黄金法则
数据温度 分片大小 副本数 段合并策略 刷新间隔
热数据 30-50GB 2 tiered(分层) 1s
温数据 50-100GB 1 log_byte_size 30s
冷数据 100-200GB 0 log_doc 关闭

3. 成本优化策略矩阵

3.1 存储成本优化

策略 实施方式 成本节省 影响范围
数据压缩 ZSTD/BEST_COMPRESSION编解码器 35%-60% 存储成本
冷热分层 生命周期自动迁移 40%-55% 存储成本
副本数调整 热数据2副本→冷数据0副本 30% 存储/计算成本
索引滚动 按时间/大小滚动创建新索引 25% 管理成本

3.2 计算成本优化

策略 实施方式 成本节省 性能影响
查询优化 避免全扫描/使用过滤条件 15%-40% 延迟降低
自动缩容 基于负载动态调整OCU数量 20%-35% 扩展延迟
缓存利用 结果缓存+分片请求缓存 30% 查询速度提升
定时降级 夜间降低副本数/合并分片 25% 查询性能波动

3.3 综合优化效果预测

优化组合 成本节省 实施复杂度 适合场景
基础策略 25%-30% ★★ 中小规模业务
高级策略 35%-45% ★★★ 大型企业
激进策略 50%+ ★★★★ 成本敏感型业务

4. 企业级优化案例

4.1 电商日志分析场景

  • 原始成本结构

    • 日均数据量:50TB
    • 存储成本:$3,450/月
    • 计算成本:$8,200/月
  • 优化措施

      1. 热数据保留3天 → 存储节省40%
      1. 启用ZSTD压缩 → 存储节省35%
      1. 夜间自动降级副本 → 计算节省25%
      1. 查询结果缓存 → 计算节省30%
  • 实施效果

指标 优化前 优化后 节省比例
存储成本 $3,450 $1,850 46.4%
计算成本 $8,200 $5,300 35.4%
P99查询延迟 620ms 480ms -22.6%

4.2 物联网时序数据场景

json 复制代码
// 向 _serverless/_index_template/iot_metrics 端点发送 PUT 请求
// 此请求用于创建或更新名为 iot_metrics 的索引模板
PUT _serverless/_index_template/iot_metrics
{
    // 指定该索引模板所适用的索引名称模式
    // 这里设置为 ["iot-*"],意味着所有以 "iot-" 开头的索引都会应用此模板
    "index_patterns": ["iot-*"],
    // 定义具体的模板内容,当创建符合上述模式的索引时,会应用这些设置
    "template": {
        "settings": {
            // 指定索引生命周期管理策略的名称
            // 这里设置为 "iot-lifecycle",意味着以 "iot-" 开头的索引将遵循此生命周期策略
            // 生命周期策略可用于管理索引的各个阶段,如热数据、温数据、冷数据阶段,以及数据的删除等操作
            "index.lifecycle.name": "iot-lifecycle",
            
            // 指定索引使用的压缩编解码器为 ZSTD
            // ZSTD 编解码器在压缩比和压缩/解压缩速度之间取得了较好的平衡
            // 可以减少索引数据的存储空间,同时保持相对较快的读写性能
            "index.codec": "ZSTD",
            
            // 配置索引的路由分配规则
            // 要求索引的数据必须分配到具有 "hot_content" 数据层属性的节点上
            // 这有助于将索引数据集中在特定类型的节点上,以满足不同数据层的性能和存储要求
            "index.routing.allocation.include.data_tier": "hot_content"
        },
        "mappings": {
            // 定义索引中文档的字段映射关系
            "properties": {
                // 定义 @timestamp 字段的类型为日期类型
                // 通常用于存储文档的时间戳信息,方便进行时间范围的查询和分析
                "@timestamp": { "type": "date" },
                // 定义 value 字段的类型为浮点型
                // 适用于存储数值类型的数据,如传感器的测量值等
                "value": { "type": "float" },
                
                // 定义 device_id 字段的类型为关键字类型
                // 关键字类型用于精确匹配,通常用于存储设备 ID 等唯一标识信息
                "device_id": { "type": "keyword" }
            }
        }
    }
}
  • 优化效果
指标 优化前 优化后 提升幅度
存储成本/TB $23 $9.2 -60%
写入吞吐量 50,000 docs/s 75,000 docs/s +50%
长期存储保留 1年 3年 +200%

5. 自动化成本管控

5.1 基于AI的成本预测

python 复制代码
# 定义一个名为 predict_cost 的函数,用于根据历史数据进行成本预测
# 参数 historical_data 是一个包含历史成本数据的序列,例如列表或数组
def predict_cost(historical_data):
    # 从 statsmodels 库的 tsa.arima.model 模块中导入 ARIMA 类
    # ARIMA(Autoregressive Integrated Moving Average)是一种常用的时间序列预测模型
    from statsmodels.tsa.arima.model import ARIMA
    
    # 创建一个 ARIMA 模型实例
    # order=(5,1,0) 是 ARIMA 模型的参数设置
    # 第一个参数 5 表示自回归阶数(p),即使用过去 5 个时间步的数据进行自回归计算
    # 第二个参数 1 表示差分阶数(d),对数据进行一阶差分以使其平稳
    # 第三个参数 0 表示移动平均阶数(q),这里不使用移动平均项
    model = ARIMA(historical_data, order=(5,1,0))
    
    # 对 ARIMA 模型进行拟合
    # 拟合过程是根据历史数据来估计模型的参数,使得模型能够尽可能准确地描述历史数据的特征
    model_fit = model.fit()
   
    # 使用拟合好的模型进行未来 30 个时间步的成本预测
    # steps=30 表示预测未来 30 个时间步的成本值
    forecast = model_fit.forecast(steps=30)
    
    # 返回预测结果
    return forecast
  • 预测准确率
时间范围 MAE(美元) RMSE(美元) R²得分
7天预测 120 150 0.92
30天预测 450 580 0.87
季度预测 2200 2800 0.78

5.2 预算告警与自动治理

json 复制代码
# 使用 Terraform 定义一个 AWS Budgets 预算资源,名称为 opensearch
resource "aws_budgets_budget" "opensearch" {
  # 预算的名称,这里设置为 monthly-opensearch-budget
  # 方便在 AWS 控制台或其他管理界面中识别该预算
  name              = "monthly-opensearch-budget"
  
  # 预算的类型,设置为 COST 表示这是一个基于成本的预算
  # 用于控制 AWS 服务的使用成本
  budget_type       = "COST"
  
  # 预算的限额金额,这里设置为 5000
  # 意味着在该预算周期内,AWS OpenSearch 服务的成本不能超过 5000
  limit_amount      = "5000"
  
  # 预算限额的货币单位,设置为 USD 表示以美元为单位
  limit_unit        = "USD"
  
  # 预算的时间周期单位,设置为 MONTHLY 表示按每月进行预算控制
  # 即每个月的成本不能超过 5000 美元
  time_unit         = "MONTHLY"

  # 配置预算的通知规则
  notification {
    # 比较运算符,设置为 GREATER_THAN 表示当实际成本超过某个阈值时触发通知
    comparison_operator = "GREATER_THAN"
    
    # 阈值,设置为 90 表示当实际成本达到预算限额的 90%(即 4500 美元)时触发通知
    threshold           = 90
    
    # 通知类型,设置为 ACTUAL 表示基于实际发生的成本进行通知
    # 还有一种类型是 FORECASTED 表示基于预测成本进行通知
    notification_type   = "ACTUAL"
    
    # 订阅通知的电子邮件地址列表
    # 当触发通知时,会向 [email protected] 发送邮件提醒
    subscriber_email_addresses = ["[email protected]"]
  }

  # 配置预算的自动调整规则
  auto_adjust {
    
    # 自动调整类型,设置为 FORECAST 表示根据成本预测自动调整预算限额
    # 例如,如果预测下个月的成本会增加,预算限额会相应地自动提高
    auto_adjust_type = "FORECAST"
  }
}
自动治理策略
触发条件 动作 冷却时间 效果验证
成本超预算80% 自动切换冷数据副本为0 1小时 成本降低15%
连续3天低负载 缩减50%计算单元 6小时 成本降低22%
存储增长>10%/天 触发归档审查流程 立即 存储节省30%+

6. 工具链与监控体系

6.1 AWS原生工具栈

工具名称 功能定位 关键指标 集成方式
Cost Explorer 成本分析与预测 每日成本/预测偏差 API/SDK
CloudWatch 性能监控与告警 OCU利用率/查询延迟 自动集成
Trusted Advisor 优化建议生成 潜在节省金额/优化项 控制台
Lambda 自动执行治理任务 治理动作触发次数 EventBridge调度
  • EventBridge
    • 核心功能架构

EventBridge调度核心 规则定义 目标集成 监控与报警 Cron表达式 事件模式匹配 时区配置 Lambda函数 Step Functions状态机 EC2实例 OpenSearch Serverless CloudWatch指标 警报通知 执行历史查询

  • 关键参数说明
参数 描述
schedule_expression Cron表达式,支持UTC时区,例如:rate(5 minutes)cron(0 3 * * ? *)
input 传递给目标的JSON格式参数,支持动态变量引用
dead_letter_config 失败任务的死信队列配置,支持SQS或SNS
retry_policy 任务失败重试策略,默认最多重试185次
  • 典型应用场景
    • 数据生命周期管理

EventBridge Lambda S3 OpenSearch 触发冷数据迁移 复制数据到冷存储 更新索引元数据 EventBridge Lambda S3 OpenSearch

  • 成本自动化报告
  • 总结
    • EventBridge 调度是实现 AWS 资源自动化的核心工具,通过结合 Lambda、Step Functions 等服务,可实现数据生命周期管理、成本优化、故障自愈等复杂场景。
    • 合理配置 Cron 表达式、监控指标和报警规则,可确保调度任务的可靠性和成本效率。

6.2 自定义监控看板

json 复制代码
{
  "widgets": [
    {
      "type": "metric",
      "properties": {
        
        // 定义要显示的指标列表
        "metrics": [
          // 第一个指标:OpenSearch集群的可搜索文档数量
          ["AWS/OpenSearch", "SearchableDocuments", "CollectionName", "prod-logs"],
          // 第二个指标:使用相对路径简化重复维度,等价于:
          // ["AWS/OpenSearch", "FreeStorageSpace", "CollectionName", "prod-logs"]
          [".", "FreeStorageSpace", ".", "."]
        ],
        
        // 数据聚合周期:5分钟(300秒)
        "period": 300,
        
        // 统计方法:平均值
        "stat": "Average",
        
        // 监控的AWS区域
        "region": "us-west-2",
       
        // 图表标题
        "title": "存储容量监控"
      }
    },
    {
      "type": "text",
      "properties": {
        // 使用Markdown格式显示文本
        "markdown": "## 实时成本\n当前月份支出:${{cost.current}} \n预测月底:${{cost.forecast}}"
      }
    }
  ]
}
  • 关键监控指标
指标名称 阈值 告警级别 响应动作
小时成本增长率 >10% P1 触发自动缩容
热数据存储占比 >70% P2 审查生命周期策略
冷数据查询量突增 >500次/分钟 P1 临时提升冷数据副本
压缩率下降 <基准值20% P3 检查压缩算法配置

7. 未来演进方向

7.1 智能分层技术

高频访问 常规访问 低频访问 几乎不访问 原始数据 机器学习预测 极热层 热层 温层 冷层

  • 预测模型效果
模型类型 预测准确率 存储节省 实施复杂度
基于规则 65% 25% ★★
时间序列预测 78% 35% ★★★
深度学习模型 92% 48% ★★★★

7.2 边缘计算协同

方案 延迟 带宽消耗 成本效益 适用场景
全云端处理 100-200ms 集中式业务
边缘预处理 20-50ms 分布式IoT
混合分层处理 50-80ms 实时分析场景

  • 实施路线图建议
    *
    1. 第一阶段:基础生命周期策略+压缩优化(1-2周)
      1. 第二阶段:引入自动扩缩容+缓存机制(3-4周)
      1. 第三阶段:部署AI预测模型+智能分层(5-8周)
      1. 持续优化:建立FinOps团队进行成本治理

"真正的成本优化不是一次性的项目,而是需要融入持续运营的体系" ------ AWS Well-Architected Framework*
该方案通过以下技术创新实现成本优化目标:

  1. 动态生命周期策略基于访问模式自动迁移数据
  2. 智能压缩算法:ZSTD与BEST_COMPRESSION混合使用
  3. 预测式扩缩容:结合时间序列预测提前调整容量
  4. 分层存储架构热/温/冷/归档四级数据管理体系
  5. FinOps自动化:成本治理策略代码化
  • FinOps

    • FinOps(Financial Operations)是一种通过云成本治理、资源优化和自动化策略,实现技术与财务团队协同的运营模式。其核心目标是:
      • 成本透明化:实时跟踪云资源使用与支出。
      • 资源高效化:消除浪费,提升 ROI。
      • 决策数据化:基于成本分析优化架构设计。
    • FinOps 核心组件

    FinOps核心 成本治理 资源优化 自动化策略 跨团队协作 标签策略 预算管理 合规审计 预留实例优化 按需实例调度 数据归档策略 生命周期管理 成本预测 自动化报警 成本分摊机制 绩效考核指标 培训与文化

  • 实施时建议优先进行成本审计(Cost Audit),识别主要开支来源,再分阶段推进优化措施。建议每季度进行一次成本健康检查,确保持续获得最优TCO。

相关推荐
joke_xiaoli2 小时前
如何重置 MySQL root 用户的登录密码?
数据库·mysql
鹏说大数据3 小时前
MySQL连接较慢原因分析及解决措施
数据库·mysql
极限实验室4 小时前
使用 INFINI Gateway 保护 Elasticsearch 集群之修改查询不合理参数(二)
数据库
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。4 小时前
etcd客户化工具
数据库·etcd
谷晓光5 小时前
python中print函数的flush如何使用
linux·服务器·数据库
OceanBase数据库官方博客5 小时前
自然语言秒转SQL—— 免费体验 OB Cloud Text2SQL 数据查询
数据库·sql·ai·oceanbase·分布式数据库·向量·text2sql
Stark、5 小时前
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
数据库·后端·sql·mysql
yqcoder5 小时前
Redis 的应用场景
数据库·redis·缓存
多多*6 小时前
浅谈Mysql数据库事务操作 用mybatis操作mysql事务 再在Springboot中使用Spring事务控制mysql事务回滚
java·数据库·windows·github·mybatis