美文网首页
replace into导致的死锁

replace into导致的死锁

作者: 快点给我想个名 | 来源:发表于2020-11-26 20:26 被阅读0次
需求

每小时统计一遍所有用户的某几项数据,一天当中此用户只有一条记录。对于有数据的用户保存数据库,否则放弃。

数据库 mysql
事务隔离级别 rr

表结构大体如下:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `time_key` int(11) NOT NULL,
  `doctor_id` varchar(50) COLLATE utf8mb4_bin NOT NULL,
  `ask_count` int(11) NOT NULL DEFAULT '0',
  `cancel_count` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uix_user_time_key_doctor_id` (`time_key`,`doctor_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

唯一索引 time_key+doctor_id

实现方式

1.对于所有的用户分页查询
2.通过CompletableFuture异步查询用户各项数据

CompletableFuture<DataTransferObject<Map<String,Integer>>> askFuture = CompletableFuture.supplyAsync(() -> askService.getAskCount(askStatisDto));
CompletableFuture<DataTransferObject<Map<String,Integer>>> cancelFuture = CompletableFuture.supplyAsync(() -> askService.getCancelCount(askStatisDto));

3.之后整合数据,异步保存

CompletableFuture.allOf(askFuture ,cancelFuture).whenCompleteAsync((aVoid, throwable) -> {
    //存库
}

4.数据库保存语句用的是 replace into 表名

问题

死锁

问题复现

1.执行第一条语句

BEGIN;

REPLACE INTO user (time_key,doctor_id,ask_count,cancel_count) values(20190523,'333',1,1);

2.执行第二条语句

BEGIN;

REPLACE INTO user (time_key,doctor_id,ask_count,cancel_count) values(20190523,'999',6,6)

3.出现死锁,命令查看

死锁.png
这里死锁是因为从(-∞,插入数据]直接加了间隙锁
详见:https://www.dazhuanlan.com/2019/10/21/5dadd2ac43e9c/ 下一个键锁(Next-Key Locks)

所以现在的问题找到了。最终的解决办法是改成了同步。

相关文章

  • replace into导致的死锁

    需求 每小时统计一遍所有用户的某几项数据,一天当中此用户只有一条记录。对于有数据的用户保存数据库,否则放弃。 数据...

  • replace into死锁引发的思考

    锁日志输出参考八怪大神 版本:Percona MySQL 5.7.22对于锁的学习我做了一些输出详细参考如下:ht...

  • 多线程二

    一、死锁 最容易导致死锁的一个情况信号锁 + 互斥锁 ,没处理好,导致死锁,NSConditionLock 解决死...

  • Replace into频发死锁原因

    背景 Replace into操作可以算是比较常用的操作类型之一,当我们不确定即将插入的记录是否存在唯一性冲突时,...

  • 并发 :线程间同步、锁、可重入锁及互斥锁

    线程间同步 线程间同步涉及线程互斥锁; 锁(Lock)容易导致死锁,可重入锁(RLock)则不会导致死锁,但每次 ...

  • 【面向校招】操作系统 —— 死锁

    死锁 1、死锁、饥饿、死循环的区别 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。 饥...

  • “锁”的性能和优化

    一、死锁 关于死锁,无外乎,对线程资源的争抢,线程之间相互等待对方释放资源,从而导致等待的一种情况。 出现死锁的条...

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • 线程同步中的死锁

    何为死锁 多线程各自持有不同的锁,并互相试图获取对方已持有的锁,导致无限等待的状况,称为死锁。比如: 避免死锁 避...

  • 多线程之_死锁

    基本介绍 多个线程都占用了对方的锁资源、但不肯想让、导致了死锁、再编程上一定要避免死锁的发生。 死锁demo 结果

网友评论

      本文标题:replace into导致的死锁

      本文链接:https://www.haomeiwen.com/subject/jpvziktx.html