大数跨境
0
0

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

并发丢数据深度剖析:JED的锁机制与事务实战踩坑及解决方案 京东技术
2025-12-02
0
导读:真实踩坑的解决方案

本文导读

基于JED的锁机制与事务隔离性导致的并发数据丢失问题,文章提出了分布式锁控制同步并发和拆分长事务为“读-算-写”三步的解决方案,解决了因锁阻塞和MVCC读取历史版本引发的数据不一致问题。

01
 
理论来源于实践
 
现象:于2025-08-13 21:45:35,事实逻辑表将自身的指标与维度同步到原子服务的实现时,出现同步过来的指标与维度丢失。
核心原因:两次重复的事实逻辑表同步时间非常相近,导致同步过来的指标与维度丢失。
02
 
倒带进事故现场
 
逻辑表向原子服务同步的核心逻辑是 “先删后增”:删除旧数据→对比新老数据→插入新增数据,具体流程如下:
整体业务代码精简逻辑如下:
@Transactional(rollbackFor = Exception.class)public Map<StringObjectdriveToAtomService(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);
共计15个指标,64个维度
核心结论点:
1. 请求2的删除操作被阻塞了,直到请求1执行完整个方法;
2.请求2中去查看当前实现的指标的时候,发现库里已经存在所有指标不会进行新增,与上一步删除的逻辑相悖。
03
 
结论点深度剖析
     

3.1 分析结论一

请求2的删除操作被阻塞了,直到请求1执行完整个方法。
3.1.1 复习JED(京东自研数据库)的锁机制
3.1.1.1 不是“一把锁”,而是 “锁矩阵”
3.1.1.2 一张图总结:锁的 “决策逻辑”
3.1.2 理论应用实践
3.1.2.1 本次事故的物料:
JED的表结构:
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(256NOT NULL DEFAULT '' COMMENT '真实指标名',  `committer` varchar(64NOT 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(32NOT NULL DEFAULT '' COMMENT '原子指标id',  `decorate_id_list_temp` varchar(32NOT NULL DEFAULT '' COMMENT '修饰列表',  `name_cn_alias_temp` varchar(32NOT NULL DEFAULT '' COMMENT '中文别名',  `metric_type_temp` varchar(32NOT NULL DEFAULT '' COMMENT '指标类型:DERIVE 衍生指标,FORMULA 复合指标',  `description_temp` varchar(64NOT NULL DEFAULT '' COMMENT '指标说明',  `data_type_temp` varchar(16NOT NULL DEFAULT '' COMMENT '数据类型:STRING,DOUBLE, LONG, INT',  `data_accuracy_temp` tinyint(4NOT NULL DEFAULT '2' COMMENT '数据精度-小数点后几位',  `security_level_temp` varchar(16DEFAULT '-1' COMMENT '安全等级',  `logic_table_id_excel_temp` varchar(16DEFAULT '-1' COMMENT '模型excelId',  `implement_type` varchar(32NOT NULL DEFAULT '' COMMENT '指标实现类型:APP、ATOMIC 原子服务',  `app_ori_metric_name_temp` varchar(16DEFAULT '' COMMENT '所依赖的app层原始名字(适用于导数任务改变字段的情况)',  `name_en_depend_atomic` varchar(256NOT NULL DEFAULT '' COMMENT '指标依赖字段',  `name_en_depend_app` varchar(16DEFAULT '' COMMENT '所依赖的app层原始名字(适用于导数任务改变字段的情况)',  `update_status` tinyint(4NOT NULL DEFAULT '0' COMMENT '信息更新状态 0-未完成更新,1-完成更新',  `status` tinyint(4NOT NULL DEFAULT '0' COMMENT '信息更新状态 0-未完成更新,1-完成更新',  `light_decorate_id_list` varchar(1024NOT NULL DEFAULT '' COMMENT '点灯修饰id列表',  `extend_decorate_id_list` varchar(1024NOT NULL DEFAULT '' COMMENT '支持的动态修饰id列表',  `extend_function_id_list` varchar(1024NOT NULL DEFAULT '' COMMENT '支持的原子服务函数id列表',  `aggregation_type` varchar(64NOT NULL DEFAULT '' COMMENT '聚合类型:ORIGINAL 原值 COUNT 计数 DISTINCT 指定字段去重 SUM 求和 AVG  均值 MIN 求最大值 MAX 求最小值 QUANTITLE 求分位数',  `middle_aggregation_type` varchar(30NOT NULL DEFAULT '' COMMENT '中间层类型,UNKNOWN:未知,AGG_BY_FIELD:按聚合字段分组后聚合,AGG_BY_DAY:按天去重后累加',  `static_decorate_id_list_combination` varchar(1024NOT NULL DEFAULT '' COMMENT '支持的固化修饰id列表组合,[[d1,d2],[d2]]',  PRIMARY KEY (`id`),  KEY `idx_metric_def_id` (`metric_def_id`,`logic_table_id`));
3.1.2.2 实践分析
通过JED的锁决策,可以得出
//删除关联指标 metricImplMapper.deleteByLogicTableIds(Collections.singletonList(logicId));
delete from unify_metric_impl where logic_table_id in (45631);

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

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

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

3.2 分析结论二

请求2中去查看当前实现的指标的时候,发现库里已经存在所有指标不会进行新增,与上一步删除的逻辑相悖。
3.2.1 复习JED的事务
3.2.1.1 ACID 不是 "四个独立特性",而是 "因果链"
  • 一句话:ACID 的核心是一致性,其他三个特性都是为了实现它的手段。
  • 一致性(Consistency):一致性确保事务将数据库从一个一致的状态转变到另一个一致的状态。即使在多个事务同时执行的情况下,数据库也能保持数据的一致性。
  • 原子性(Atomicity):事务是 "不可分割的工作单元"(要么全成,要么全败),是一致性的前提(如果步骤能拆分,中间失败就会破坏一致性)。
  • 隔离性(Isolation):通过控制多事务并发规则,避免互相干扰,是一致性的保障(并发混乱会直接破坏一致性)。
  • 耐久性(Durability):事务提交后结果永久保存,是一致性的最终落点(否则重启后数据丢失,之前的一致性白搭)。
3.2.1.2 隔离级别:不是 "越严越好",而是 "成本与需求的平衡术"
JED的4种隔离级别,本质是用 "数据可见性" 换 "并发性能"的选择:
3.2.1.3 MVCC:事务的 "平行宇宙" 机制(为什么读写不冲突?)
多版本并发控制是 "无锁读" 的核心,它让读和写像在平行宇宙中运行:
底层逻辑(用 "时间戳" 理解):
  • 每个事务启动时,会拿到一个全局递增的事务 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 事务日志:"安全与性能" 平衡术
事务能既保证 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;
需要删除的指标实现(根据实现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	(13581951987245631'jdr_7fresh_trade_complete_ord_user_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(13581961987345631'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'''''''''00'''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'''),	(13581971987545631'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'''''''''00'''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'''),	(13581981994545631'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'''''''''00'''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'''),	(13581991726345631'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'''''''''00'''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'''),	(13582002801745631'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'''''''''00'''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'''),	(13582012024245631'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'''''''''00'''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'''),	(13582021845045631'jdr_7fresh_trade_deal_ord_ord_amt_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(13582032027645631'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'''''''''00'''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'''),	(13582041845245631'jdr_7fresh_trade_deal_ord_sku_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(13582051845345631'jdr_7fresh_trade_deal_ord_user_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(13582061845645631'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'''''''''00'''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'''),	(13582071986645631'jdr_7fresh_trade_complete_ord_ord_amt_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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 * 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	(1987245631'jdr_7fresh_trade_complete_ord_user_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(1987345631'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'''''''''00'''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'''),	(1987545631'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'''''''''00'''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'''),	(1994545631'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'''''''''00'''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'''),	(1726345631'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'''''''''00'''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'''),	(2801745631'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'''''''''00'''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'''),	(2024245631'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'''''''''00'''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'''),	(1845045631'jdr_7fresh_trade_deal_ord_ord_amt_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(2027645631'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'''''''''00'''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'''),	(1845245631'jdr_7fresh_trade_deal_ord_sku_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(1845345631'jdr_7fresh_trade_deal_ord_user_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(1845645631'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'''''''''00'''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'''),	(1986645631'jdr_7fresh_trade_complete_ord_ord_amt_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(2169145631'jdr_7fresh_trade_deal_ord_ord_amt_include_moutai''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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'''),	(1987145631'jdr_7fresh_trade_complete_ord_sku_qtty_deal_7fresh''''2025-09-02 09:23:41''2025-09-02 09:23:41'''''''''''''2'-1''-1'''''''''00'''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;
流程图(用一行数据进行演示版本控制):
为何事务1的select查询出“为空”,事务2的select查询出“不为空”:
04
 
解决办法
 
为了解决事务2的查询"不为空"的问题,分别列出以下方案:
当前落地情况已通过 “分布式锁控制同一逻辑表同步并发” 的短期方案解决事故,后续将在业务迭代中推进 “读 - 算 - 写” 拆分的长期优化,进一步降低事务粒度与锁冲突风险。
05
 
附录
 
事实逻辑表:由物理数仓中的事实表和维度逻辑表关联形成的语义表,可以描述业务过程的详细信息,是指标的数据来源。
原子服务:指标的实现方式,一个指标可以有多个实现。

推荐阅读

大模型时代的广告营销变革与实践

常用Web 实时通信技术:原理+选型,一篇通关

当搜索遇见 AIGC:京东零售的“千人千面”素材生成实践

超越大小与热度:JIMDB“大热Key”主动治理解决方案深度解析


关注我们

【声明】内容源于网络
0
0
京东技术
京东官方技术分享平台。你想知道的京东前沿技术、创新思考、开源方案...这里应有尽有!
内容 804
粉丝 0
京东技术 京东官方技术分享平台。你想知道的京东前沿技术、创新思考、开源方案...这里应有尽有!
总阅读40
粉丝0
内容804