0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

并发丢数据深度剖析:MySQL锁机制与事务实战踩坑及解决方案

京东云 来源:jf_75140285 作者:jf_75140285 2025-11-10 19:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、理论来源于实践

现象:于2025-08-13 21:45:35,事实逻辑表将自身的指标与维度同步到原子服务的实现时,出现同步过来的指标与维度丢失。

核心原因:两次重复的事实逻辑表同步时间非常相近,导致同步过来的指标与维度丢失。



wKgZPGkRxbuATZlXAAFCAAQQv7E421.jpg

2、倒带进事故现场

逻辑表向原子服务同步的核心逻辑是 “先删后增”:删除旧数据→对比新老数据→插入新增数据,具体流程如下:

wKgZO2kRxbyAeJ1MAACeyh4Cpro414.jpg

整体业务代码精简逻辑如下:

@Transactional(rollbackFor = Exception.class)
public Map< String, Object > driveToAtomService(Map logicTableData, String erp) {
//获得环境信息
String env = driveLogicTable.getString(DRIVE_LOGIC_TABLE_ENV);
//获取/更新实现id
 Long logicTableId = getOrAddLogicTableId(atomicServiceId, driveLogicTable, erp, EnvType.of(env));
//删除关联指标
 metricImplMapper.deleteByLogicTableIds(Collections.singletonList(logicId));
//获取请求中的所有的指标信息
List< MetricImplBO > metricList = getMetricImpls(logicTableData, logicTableId);
//获取需要新增的指标实现(包含了查询库里现有的指标实现)
List< MetricImplRelBO > metricImpls = metricImplMapper.getMetricImpls(logicTableId);
Set< Long > metricDefIdSet = metricImpls.stream()
            .map(MetricImplRelBO::getMetricDefId).collect(Collectors.toSet());
List< MetricImplBO > addList = metricList.stream()
            .filter(s -> !metricDefIdSet.contains(s.getMetricDefId())).collect(Collectors.toList());
//将需要新增的指标实现插入数据库
 addMetricImpl(addList);

}

用一个请求进行举例:

{"header":{"appKey":null,"uuid":"ce7cef2d-c417-464a-a519-311599fddfca","serviceName":"driveToAtomService","context":{"PIN":"wanyue3"}},"body":{"dimList":[{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":72,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2501,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2484,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2502,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4591,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3822,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4523,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4524,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":76,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1767,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1907,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1598,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4620,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4621,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4622,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2504,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2485,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2486,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2487,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2488,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3077,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3080,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3081,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2483,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2482,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3082,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3083,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4851,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2503,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5070,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5044,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5087,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5144,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5145,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3089,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3680,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2223,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5428,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5101,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1315,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5247,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":3318,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5262,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":4646,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2252,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2254,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2959,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2958,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2728,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":2618,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":5061,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":6032,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":6375,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":6388,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":6389,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1316,"type":"ALL"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1081,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1351,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1082,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1499,"type":"COMBINE"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1596,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1606,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1083,"type":"FILTER"},{"isRequiredForFilter":0,"supportCrossTopic":0,"dimDefId":1108,"type":"FILTER"}],"dimCombineList":[],"metricList":[{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19872,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19873,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19875,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19945,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":17263,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"COUNT_DISTINCT","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":28017,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":20242,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":18450,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":20276,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":18452,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":18453,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":18456,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19866,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":21691,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"},{"lightDecorateIdList":"","aggregationType":"toSql","middleAggregationType":"DEFAULT","extendDecorateIdList":"4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867","staticDecorateIdListCombination":"","metricDefId":19871,"nameEnAtomic":null,"extendFunctionIdList":"25,6,5,7,23,22,20,21,19,18,4,1,2,3,24"}],"driveLogicTable":"{"dimensionType":"DETAIL","oldNameCn":"七鲜实时交易_for地推中间态新老标志","atomicAliasProd":"prod","implServiceTypeKey":"realtime","originPhysicDataSourceId":0,"nameCn":"七鲜实时交易_for地推中间态新老标志","description":"七鲜实时交易_for地推中间态新老标志","driveLogicTableId":9881,"driveLogicTableEnv":"DEV","commonDecorateIdList":"9665,3269,3270,3271,4556,8012,8270,6030,7247,6031,7248,6032,7249,6033,7250,6034,6035,2134,7254,7255,2085,619,620,5997,1586,7867,6845","atomicAliasPre":"pre","committer":"panjingrong","physicDataSourceId":9494,"storageType":"ONLINE","atomicAliasDev":"pre"}","atomicServiceId":1088},"pin":"wanyue3"}

共计15个指标,64个维度

请求1(事务) 请求2(事务) 
21:06:17.262 进入同步方法 21:06:17.263 进入同步方法 
21:06:17.063 select unify_metric_impl where logic_id = 3245 查询出15条数据(快照读,readview1) 21:06:17.363 select unify_metric_impl where logic_id = 3245 查询出15条数据(快照读,readview2) 
21:06:17.363 delete from unify_metric_impl where logic_id = 3245 21:06:17.372 delete from unify_metric_impl where logic_id = 3245 
21:06:17.459 select unify_metric_impl where logic_id = 3245 查询出0条数据 
delete 由于logic_id不是索引,会表锁阻塞 
21:06:18.459 insert into unify_metric_impl 插入的logic_id = 3245的数据,15条 


21:06:19.408 方法结束 




21:06:19.529 删除成功 


21:06:20.362 select unify_metric_impl where logic_id = 3245 得到 15条数据 


21:06:20.435 读出15条数据,比较本次是否有新增指标, 得出没有新增指标,因此不进行新增。addAtomicMetricNameForDrive addList empty 


21:06:21.435 方法结束 



核心结论点

1.请求2的删除操作被阻塞了,直到请求1执行完整个方法。

2.请求2中去查看当前实现的指标的时候,发现库里已经存在所有指标不会进行新增,与上一步删除的逻辑相悖。



3、结论点深度剖析

3.1 分析结论一

请求2的删除操作被阻塞了,直到请求1执行完整个方法。

3.1.1 复习mysql的InnoDB锁机制

3.1.1.1 不是“一把锁”,而是 “锁矩阵”

锁粒度 共享锁(S 锁) (读锁,允许多读) 排他锁(X 锁) (写锁,独占) 意向锁(表级,辅助判断)
表级 表 S 锁(极少用,如LOCK TABLES ... READ) 表 X 锁(极少用,如LOCK TABLES ... WRITE) 意向 S 锁(IS)、意向 X 锁(IX)
行级 行 S 锁(SELECT ... FOR SHARE) 行 X 锁(UPDATE/DELETE/INSERT默认加) (行锁无需意向锁)
间隙级 间隙 S 锁(无,间隙只防插入) 间隙 X 锁(防其他事务插入相同间隙)
Next-Key Next-Key 锁(行锁 + 间隙锁,默认行锁算法



3.1.1.2 一张图总结:InnoDB 锁的 “决策逻辑”



wKgZPGkRxb2ANDL9AAB52kaKj5o708.jpg



3.1.2 理论应用实践

3.1.2.1 本次事故的物料:

mysql表:

CREATE TABLE `unify_metric_impl` (
  `id` bigint(50) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `metric_def_id` bigint(11) unsigned NOT NULL DEFAULT '0' COMMENT '指标定义id',
  `logic_table_id` bigint(11) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑表id',
  `name_en_atomic` varchar(256) NOT NULL DEFAULT '' COMMENT '真实指标名',
  `committer` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `metric_atomic_name_temp` varchar(32) NOT NULL DEFAULT '' COMMENT '原子指标id',
  `decorate_id_list_temp` varchar(32) NOT NULL DEFAULT '' COMMENT '修饰列表',
  `name_cn_alias_temp` varchar(32) NOT NULL DEFAULT '' COMMENT '中文别名',
  `metric_type_temp` varchar(32) NOT NULL DEFAULT '' COMMENT '指标类型:DERIVE 衍生指标,FORMULA 复合指标',
  `description_temp` varchar(64) NOT NULL DEFAULT '' COMMENT '指标说明',
  `data_type_temp` varchar(16) NOT NULL DEFAULT '' COMMENT '数据类型:STRING,DOUBLE, LONG, INT',
  `data_accuracy_temp` tinyint(4) NOT NULL DEFAULT '2' COMMENT '数据精度-小数点后几位',
  `security_level_temp` varchar(16) DEFAULT '-1' COMMENT '安全等级',
  `logic_table_id_excel_temp` varchar(16) DEFAULT '-1' COMMENT '模型excelId',
  `implement_type` varchar(32) NOT NULL DEFAULT '' COMMENT '指标实现类型:APP、ATOMIC 原子服务',
  `app_ori_metric_name_temp` varchar(16) DEFAULT '' COMMENT '所依赖的app层原始名字(适用于导数任务改变字段的情况)',
  `name_en_depend_atomic` varchar(256) NOT NULL DEFAULT '' COMMENT '指标依赖字段',
  `name_en_depend_app` varchar(16) DEFAULT '' COMMENT '所依赖的app层原始名字(适用于导数任务改变字段的情况)',
  `update_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '信息更新状态 0-未完成更新,1-完成更新',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '信息更新状态 0-未完成更新,1-完成更新',
  `light_decorate_id_list` varchar(1024) NOT NULL DEFAULT '' COMMENT '点灯修饰id列表',
  `extend_decorate_id_list` varchar(1024) NOT NULL DEFAULT '' COMMENT '支持的动态修饰id列表',
  `extend_function_id_list` varchar(1024) NOT NULL DEFAULT '' COMMENT '支持的原子服务函数id列表',
  `aggregation_type` varchar(64) NOT NULL DEFAULT '' COMMENT '聚合类型:ORIGINAL 原值 COUNT 计数 DISTINCT 指定字段去重 SUM 求和 AVG  均值 MIN 求最大值 MAX 求最小值 QUANTITLE 求分位数',
  `middle_aggregation_type` varchar(30) NOT NULL DEFAULT '' COMMENT '中间层类型,UNKNOWN:未知,AGG_BY_FIELD:按聚合字段分组后聚合,AGG_BY_DAY:按天去重后累加',
  `static_decorate_id_list_combination` varchar(1024) NOT NULL DEFAULT '' COMMENT '支持的固化修饰id列表组合,[[d1,d2],[d2]]',
  PRIMARY KEY (`id`),
  KEY `idx_metric_def_id` (`metric_def_id`,`logic_table_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='指标实现';

3.1.2.2 实践分析

通过mysql的innoDB的锁决策,可以得出

//删除关联指标
 metricImplMapper.deleteByLogicTableIds(Collections.singletonList(logicId));

delete from unify_metric_impl where logic_table_id in (45631);

mysql的索引:KEY `idx_metric_def_id` (`metric_def_id`,`logic_table_id`)

删除写操作,不符合最左匹配原则,因此为表x锁。

wKgZO2kRxb2AKbZyAACRE2lWSLs325.jpg

因此请求2的删除操作需要等待请求1的事务释放表锁后才可继续进行,符合当时场景。



3.2 分析结论二

请求2中去查看当前实现的指标的时候,发现库里已经存在所有指标不会进行新增,与上一步删除的逻辑相悖。

3.2.1 复习Mysql的事务

3.2.1.1 ACID 不是 "四个独立特性",而是 "因果链"



wKgZPGkRxb6AYCL9AAAhcRQYtNo038.jpg

一句话:ACID 的核心是一致性,其他三个特性都是为了实现它的手段。

一致性(Consistency):一致性确保事务将数据库从一个一致的状态转变到另一个一致的状态。即使在多个事务同时执行的情况下,数据库也能保持数据的一致性。

原子性(Atomicity):事务是 "不可分割的工作单元"(要么全成,要么全败),是一致性的前提(如果步骤能拆分,中间失败就会破坏一致性)。

隔离性(Isolation):通过控制多事务并发规则,避免互相干扰,是一致性的保障(并发混乱会直接破坏一致性)。

耐久性(Durability):事务提交后结果永久保存,是一致性的最终落点(否则重启后数据丢失,之前的一致性白搭)。



3.2.1.2 隔离级别:不是 "越严越好",而是 "成本与需求的平衡术"

InnoDB 的 4 种隔离级别,本质是用 "数据可见性" 换 "并发性能"的选择:

隔离级别 解决的问题 无法解决的问题 性能消耗 典型场景
读未提交(RU) 脏读、不可重复读、幻读 极低 实时监控(允许脏数据)
读已提交(RC) 脏读 不可重复读、幻读 互联网普通业务
可重复读(RR,默认) 脏读、不可重复读 幻读(被 Next-Key 锁解决) 金融交易、库存管理
串行化(Serializable) 所有并发问题 极高 银行对账(无并发需求)



3.2.1.3 MVCC:事务的 "平行宇宙" 机制(为什么读写不冲突?)

InnoDB 的多版本并发控制是 "无锁读" 的核心,它让读和写像在平行宇宙中运行:

底层逻辑(用 "时间戳" 理解):

•每个事务启动时,会拿到一个全局递增的事务 ID(trx_id)

•每行数据隐藏 3 个字段:

◦DB_TRX_ID:最后修改该行的事务 ID;

◦DB_ROLL_PTR:指向 undo 日志的指针(存储历史版本);

◦DB_DELETED:标记是否删除(逻辑删除)。

读操作的 "幻术"

快照读(普通 SELECT):只看 "事务 ID ≤ 自己 ID" 且 "未被删除" 的版本,完全不加锁。 例:事务 A(ID=100)查询时,会忽略所有被 ID>100 的事务修改的数据。

包含 4 个核心字段:

•m_ids:生成 Read View 时,当前活跃的事务 ID 列表(未提交的事务)。

•min_trx_id:m_ids中最小的事务 ID。

•max_trx_id:下一个将要分配的事务 ID(非活跃事务 ID,仅用于判断 “未来事务”)。

•creator_trx_id:生成该 Read View 的事务自身 ID。

可见性判断规则(一条记录是否对当前事务可见,取决于其 “最后修改事务 ID”,记为db_trx_id):

1.若db_trx_id == creator_trx_id:可见(自己修改的自己可见)。

2.若db_trx_id < min_trx_id:可见(修改记录的事务在当前快照生成前已提交)。

3.若db_trx_id >= max_trx_id:不可见(修改记录的事务在当前快照生成后才启动)。

4.若min_trx_id ≤ db_trx_id < max_trx_id:

◦若db_trx_id在m_ids中:不可见(该事务仍活跃,未提交)。

◦若db_trx_id不在m_ids中:可见(该事务已提交)。

5.当前读(加锁读 / 写操作):读取最新版本,并加锁防止其他事务修改。

3.2.1.4 事务日志:InnoDB 的 "安全与性能" 平衡术

事务能既保证 durability 又不慢,全靠两大日志:

1.redo log(重做日志)

◦作用:崩溃后恢复未写入磁盘的数据(保证 durability)。

◦反直觉:事务提交时,数据先写 redo log(内存 + 磁盘),再异步刷到数据文件(这叫 WAL 技术)。

◦为什么快?redo log 是顺序写(磁盘顺序写比随机写快 100 倍 +)。

2.undo log(回滚日志)

◦作用:保存数据修改前的版本,用于事务回滚(保证 atomicity)和 MVCC 快照读。

◦注意:undo log 会被 purge 线程定期清理(当没有事务需要旧版本时)。

3.2.1.5 终极心法:事务设计的 "3 个凡是"

1.凡是不需要事务的操作,坚决不用(如日志插入可关闭自动提交,批量提交)。

2.凡是能在 RC 解决的,绝不升 RR(互联网业务优先选 RC,用业务逻辑防不可重复读)。

3.凡是大事务,必拆分成 "读 - 算 - 写" 三步(读阶段不加锁,算阶段在应用层,写阶段用最短事务加锁)。

记住:事务的本质不是 "约束",而是 "工具"—— 能解决问题的最简单事务,才是最好的事务。



3.2.2 理论应用实践

3.2.2.1 本次事故的物料:

表的事务等级:

SELECT @@transaction_isolation;

wKgZO2kRxb6AOgpdAAA8ZrRWdB8737.png



需要删除的指标实现(根据实现id):

delete from unify_metric_impl where logic_table_id in (45631);

需要插入的指标实现:

INSERT INTO `unify_metric_impl` (`id`, `metric_def_id`, `logic_table_id`, `name_en_atomic`, `committer`, `create_time`, `update_time`, `metric_atomic_name_temp`, `decorate_id_list_temp`, `name_cn_alias_temp`, `metric_type_temp`, `description_temp`, `data_type_temp`, `data_accuracy_temp`, `security_level_temp`, `logic_table_id_excel_temp`, `implement_type`, `app_ori_metric_name_temp`, `name_en_depend_atomic`, `name_en_depend_app`, `update_status`, `status`, `light_decorate_id_list`, `extend_decorate_id_list`, `extend_function_id_list`, `aggregation_type`, `middle_aggregation_type`, `static_decorate_id_list_combination`)
VALUES
	(1358195, 19872, 45631, 'jdr_7fresh_trade_complete_ord_user_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358196, 19873, 45631, 'jdr_7fresh_trade_complete_ord_sku_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358197, 19875, 45631, 'jdr_7fresh_trade_complete_ord_ord_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358198, 19945, 45631, 'jdr_7fresh_sku_deal_ord_sku_dis_qtty_main_img_video_num', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358199, 17263, 45631, 'jdr_7fresh_trade_deal_ord_ord_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358200, 28017, 45631, 'jdr_7fresh_bd_bd_attendance_offline__store_cnt_bd_attendance_cnt', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'COUNT_DISTINCT', 'DEFAULT', ''),
	(1358201, 20242, 45631, 'jdr_7fresh_trade_deal_ord_app__ord_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358202, 18450, 45631, 'jdr_7fresh_trade_deal_ord_ord_amt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358203, 20276, 45631, 'jdr_7fresh_trade_deal_ord_app__ord_cnt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358204, 18452, 45631, 'jdr_7fresh_trade_deal_ord_sku_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358205, 18453, 45631, 'jdr_7fresh_trade_deal_ord_user_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358206, 18456, 45631, 'jdr_7fresh_trade_deal_ord_sku_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358207, 19866, 45631, 'jdr_7fresh_trade_complete_ord_ord_amt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358208, 21691, 45631, 'jdr_7fresh_trade_deal_ord_ord_amt_include_moutai', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(1358209, 19871, 45631, 'jdr_7fresh_trade_complete_ord_sku_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', '');


3.2.2.2 实践分析:

用sql模拟两个事务的执行过程:

事务1:

begin;

select * from unify_metric_impl umi where logic_table_id =  45631;

delete from unify_metric_impl where logic_table_id in (45631);

SELECT trx_id, trx_query FROM INFORMATION_SCHEMA.INNODB_TRX;

select * from unify_metric_impl umi where logic_table_id =  45631;

INSERT INTO `unify_metric_impl` ( `metric_def_id`, `logic_table_id`, `name_en_atomic`, `committer`, `create_time`, `update_time`, `metric_atomic_name_temp`, `decorate_id_list_temp`, `name_cn_alias_temp`, `metric_type_temp`, `description_temp`, `data_type_temp`, `data_accuracy_temp`, `security_level_temp`, `logic_table_id_excel_temp`, `implement_type`, `app_ori_metric_name_temp`, `name_en_depend_atomic`, `name_en_depend_app`, `update_status`, `status`, `light_decorate_id_list`, `extend_decorate_id_list`, `extend_function_id_list`, `aggregation_type`, `middle_aggregation_type`, `static_decorate_id_list_combination`)
VALUES
	(19872, 45631, 'jdr_7fresh_trade_complete_ord_user_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(19873, 45631, 'jdr_7fresh_trade_complete_ord_sku_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(19875, 45631, 'jdr_7fresh_trade_complete_ord_ord_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(19945, 45631, 'jdr_7fresh_sku_deal_ord_sku_dis_qtty_main_img_video_num', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(17263, 45631, 'jdr_7fresh_trade_deal_ord_ord_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(28017, 45631, 'jdr_7fresh_bd_bd_attendance_offline__store_cnt_bd_attendance_cnt', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'COUNT_DISTINCT', 'DEFAULT', ''),
	(20242, 45631, 'jdr_7fresh_trade_deal_ord_app__ord_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(18450, 45631, 'jdr_7fresh_trade_deal_ord_ord_amt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(20276, 45631, 'jdr_7fresh_trade_deal_ord_app__ord_cnt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(18452, 45631, 'jdr_7fresh_trade_deal_ord_sku_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(18453, 45631, 'jdr_7fresh_trade_deal_ord_user_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(18456, 45631, 'jdr_7fresh_trade_deal_ord_sku_dis_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(19866, 45631, 'jdr_7fresh_trade_complete_ord_ord_amt_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(21691, 45631, 'jdr_7fresh_trade_deal_ord_ord_amt_include_moutai', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', ''),
	(19871, 45631, 'jdr_7fresh_trade_complete_ord_sku_qtty_deal_7fresh', '', '2025-09-02 09:23:41', '2025-09-02 09:23:41', '', '', '', '', '', '', 2, '-1', '-1', '', '', '', '', 0, 0, '', '4556,8012,8270,7247,7248,7249,7250,2134,7254,7255,5997,7867', '25,6,5,7,23,22,20,21,19,18,4,1,2,3,24', 'toSql', 'DEFAULT', '');

commit;



事务2:

begin;

select * from unify_metric_impl umi where logic_table_id =  45631;

delete from unify_metric_impl where logic_table_id in (45631);

select * from unify_metric_impl umi where logic_table_id =  45631;

commit;



流程图(用一行数据进行演示版本控制):

wKgZPGkRxcCANjglAARNGmNFfYY700.png



为何事务1的select查询出“为空”,事务2的select查询出“不为空”:

对比维度 事务 1 查询(读自己的删除版本 V2) 事务 2 查询(读readview前的V1版本)
自己生成的版本 V2(trx_id=17190,已删除) V4(trx_id=17191,已删除)
对自己版本的处理 可见,且事务内需反映自己的删除操作,所以不追溯前驱 V1 不可见,但当前删除的版本是由其他事务得到(V3),并非在readview之前的数据。
追溯的终止条件 遇到自己生成的版本,即使已删除,也终止追溯 遇到自己生成的已删除版本,但不符合"有效删除",需继续追溯
最终返回结果 v2(已删除版本,反映自己的删除操作) V1(readview之前有效的版本)



4.解决办法

为了解决事务2的查询"不为空"的问题,分别列出以下方案:


解决办法 优点 缺点 倾向
方式1 针对同一个逻辑表的同步添加分布式锁 实现成本低,影响范围小 存在长事务的问题 短期解法
方式2 将事务2的select改为当前读(使用slecet...for update),这样就能查询出最新的数据为空 实现成本低, 存在长事务的问题,影响范围大(长事务涉及逻辑多) 不推荐
方式3 将长事务拆分, "读 - 算 - 写" 三步 1. 读:无锁读取原子服务与实现数据; 2. 算:在应用层对比新增 / 删除数据; 3. 写:仅对差异数据执行短事务操作 从根源解决问题 实现成本大,重构该方法 长期解法

当前落地情况:已通过 “分布式锁控制同一逻辑表同步并发” 的短期方案解决事故,后续将在业务迭代中推进 “读 - 算 - 写” 拆分的长期优化,进一步降低事务粒度与锁冲突风险。

5.附录

5.1名词解释

事实逻辑表:由物理数仓中的事实表和维度逻辑表关联形成的语义表,可以描述业务过程的详细信息,是指标的数据来源。

原子服务:指标的实现方式,一个指标可以有多个实现。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MySQL
    +关注

    关注

    1

    文章

    930

    浏览量

    29740
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Java并发编程的“基石”——多线程概念初识

    AI 算力调度底层:Java 并发基石与未来技术融合 当我们在屏幕前流畅地与大语言模型对话,或是看着自动驾驶系统瞬间处理海量视觉数据时,往往只会惊叹于 AI 算法的精妙。然而,在这层绚丽的应用外衣
    发表于 04-16 18:50

    芯片被、无法烧录、包10%?Exx-SC套件特殊问题自救手册

    开发不用慌,这篇教你一一攻克一、引言本次主要介绍套件一些特殊使用的示例,解决常见开发难题,例如:芯片被时如何解锁烧录引脚因错误配置而无法烧录的解决方案固定
    的头像 发表于 03-12 19:33 210次阅读
    芯片被<b class='flag-5'>锁</b>、无法烧录、<b class='flag-5'>丢</b>包10%?Exx-SC套件特殊问题自救手册

    TPS84610:高效集成电源解决方案深度剖析

    TPS84610:高效集成电源解决方案深度剖析 在电子设计领域,一款性能卓越、功能丰富的电源解决方案至关重要。TPS84610作为一款备受关注的产品,为工程师们提供了出色的选择。本文
    的头像 发表于 03-04 15:20 169次阅读

    到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得

    API」 关键词搜索是电商数据业务最常用、最容易翻车、最影响体验的接口: • 搜不到结果 • 翻几页就断 • 排序不准、价格假 • 封号、限流、字段乱变 • 并发一高直接崩 从
    的头像 发表于 02-28 14:22 1497次阅读

    MySQL事务机制详解

    在我担任某互联网金融平台SRE期间,曾遇到过一次严重的线上事故:凌晨3点,监控系统疯狂告警,数据库活跃连接数从平时的200飙升到2000,大量请求超时。紧急排查后发现,一个批量更新任务与在线交易产生了死锁,导致数据库连接被占满。
    的头像 发表于 01-27 10:33 371次阅读

    智能工厂改造?有人物联网手把手教你挑对系统

    中小工厂砸几十万搞智能改造,结果了最冤的:花 “智慧工厂系统” 的钱,买的只是个 “升级款工厂监控系统”—— 只能看设备转不转,没法调生产、降能耗,钱直接打了水漂。智能改造选系统,真的像开盲盒
    的头像 发表于 12-19 14:20 404次阅读
    智能工厂改造<b class='flag-5'>踩</b><b class='flag-5'>坑</b>?有人物联网手把手教你挑对系统

    Amphenol FlexTraX:创新电缆管理解决方案深度剖析

    Amphenol FlexTraX:创新电缆管理解决方案深度剖析 在电子设备和网络系统中,电缆管理一直是一个关键且具有挑战性的任务。合理的电缆管理不仅能提高系统的可靠性和可维护性,还能提升整体的美观
    的头像 发表于 12-11 14:50 512次阅读

    STM32 5 个容易的外设使用技巧

    STM32是嵌入式开发领域的热门MCU,功能丰富到几乎可以完成所有常见控制任务:GPIO、ADC、UART、定时器、DMA……应有尽有。但是,正因为功能强大,开发中的机会也随之增多。很多初学者
    的头像 发表于 11-24 19:04 961次阅读
    STM32 5 个容易<b class='flag-5'>踩</b><b class='flag-5'>坑</b>的外设使用技巧

    分页!京东商品详情接口实战指南:从并发优化到数据完整性闭环

    京东商品详情接口(jingdong.ware.get)是电商数据开发的核心难点,本文详解其权限申请、分页优化、多规格递归解析与完整性校验等实战方案,结合代码示例与性能调优参数,助你高效稳定对接,提升
    的头像 发表于 09-30 15:50 1190次阅读

    别再卡分页!淘宝全量商品接口实战开发指南:从并发优化到数据完整性闭环

    淘宝店铺全量商品接口实战指南:详解权限申请、分页优化、并发拉取与增量更新,结合代码实现高效稳定的数据获取,解决超时、限流、数据丢失等核心难题,助力电商
    的头像 发表于 09-30 10:47 693次阅读

    京东商品 SKU 信息接口技术干货:数据拉取、规格解析与字段治理(附总结 + 可运行代码

    本文详解京东商品SKU接口对接技术,涵盖核心参数、权限申请、签名生成、规格解析及常见解决方案,结合可运行代码与实战经验,助力开发者高效集成SKU数据,实现库存、价格等关键信息精准获
    的头像 发表于 09-29 11:56 756次阅读
    京东商品 SKU 信息接口技术干货:<b class='flag-5'>数据</b>拉取、规格解析与字段治理(附<b class='flag-5'>踩</b><b class='flag-5'>坑</b>总结 + 可运行代码

    UWB自动跟随技术原理、算法融合优化和实录

    UWB为什么是最靠谱的自动跟随技术?原理是什么?需要做什么算法融合、优化?我们在开发过程中过的
    的头像 发表于 08-14 17:45 1750次阅读
    UWB自动跟随技术原理、算法融合优化和<b class='flag-5'>踩</b><b class='flag-5'>坑</b>实录

    企业级MySQL数据库管理指南

    在当今数字化时代,MySQL作为全球最受欢迎的开源关系型数据库,承载着企业核心业务数据的存储与处理。作为数据库管理员(DBA),掌握MySQL
    的头像 发表于 07-09 09:50 870次阅读

    鸿蒙5开发宝藏案例分享---应用并发设计

    ?** 鸿蒙并发编程实战指南:解锁ArkTS多线程黑科技** 嘿,开发者朋友们! 今天给大家扒一扒鸿蒙官方文档里藏着的并发编程宝藏—— 100+实战场景
    发表于 06-12 16:19

    HarmonyOS实战:一招解决等待多个并发结果

    讲解开发过程中遇到的并发问题,官方API 11文档写的太简单了,根本没有解决方案,小编也是苦思冥想,绞尽脑汁才找到解决方案。需要开发鸿蒙的小伙伴可以仔细阅读,避免
    的头像 发表于 06-09 14:57 710次阅读
    HarmonyOS<b class='flag-5'>实战</b>:一招解决等待多个<b class='flag-5'>并发</b>结果