• MySQL--REPLACE INTO导致的死锁案例01


    测试场景

    • MySQL版本: 5.7.29
    • 事务级别: READ-COMMITTED

    测试数据

    
    DROP TABLE IF EXISTS tb1001;
    CREATE TABLE `tb1001` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `c1` INT(11) NOT NULL,
      `c2` INT(11) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `UNI_C1` (`c1`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    INSERT INTO TB1001(C1,C2)SELECT 1,1;
    INSERT INTO TB1001(C1,C2)SELECT 2,2;
    INSERT INTO TB1001(C1,C2)SELECT 3,3;
    
    

    测试操作

    会话1先执行:

    BEGIN;
    ## 执行成功
    REPLACE INTO tb1001(c1,c2)VALUES(2,22)
    
    

    会话2再执行:

    BEGIN;
    ## 执行被阻塞
    REPLACE INTO tb1001(c1,c2)VALUES(1,11)
    
    

    会话3查下锁信息:

    mysql> select * from information_schema.INNODB_LOCKS;
    +----------------+-------------+-----------+-----------+-----------------+------------+------------+-----------+----------+-----------+
    | lock_id        | lock_trx_id | lock_mode | lock_type | lock_table      | lock_index | lock_space | lock_page | lock_rec | lock_data |
    +----------------+-------------+-----------+-----------+-----------------+------------+------------+-----------+----------+-----------+
    | 15317:1890:4:3 | 15317       | X         | RECORD    | `test`.`tb1001` | UNI_C1     |       1890 |         4 |        3 | 2         |
    | 15312:1890:4:3 | 15312       | X         | RECORD    | `test`.`tb1001` | UNI_C1     |       1890 |         4 |        3 | 2         |
    +----------------+-------------+-----------+-----------+-----------------+------------+------------+-----------+----------+-----------+
    

    会话1再执行:

    ## 执行成功
    REPLACE INTO tb1001(c1,c2)VALUES(1,11)
    
    

    出现死锁,会话2被回滚

    死锁信息

    ------------------------
    LATEST DETECTED DEADLOCK
    ------------------------
    2021-04-07 16:39:33 0x7f9222cab700
    *** (1) TRANSACTION:
    TRANSACTION 15317, ACTIVE 213 sec updating or deleting
    mysql tables in use 1, locked 1
    LOCK WAIT 4 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 2
    MySQL thread id 55, OS thread handle 140265625392896, query id 395 127.0.0.1 mysql_admin update
    REPLACE INTO tb1001(c1,c2)VALUES(1,11)
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 1890 page no 4 n bits 72 index UNI_C1 of table `test`.`tb1001` trx id 15317 lock_mode X waiting
    Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
     0: len 4; hex 80000002; asc     ;;
     1: len 4; hex 80000002; asc     ;;
    
    *** (2) TRANSACTION:
    TRANSACTION 15312, ACTIVE 224 sec inserting
    mysql tables in use 1, locked 1
    5 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 3
    MySQL thread id 56, OS thread handle 140265625663232, query id 396 127.0.0.1 mysql_admin update
    REPLACE INTO tb1001(c1,c2)VALUES(1,11)
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 1890 page no 4 n bits 72 index UNI_C1 of table `test`.`tb1001` trx id 15312 lock_mode X
    Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
     0: len 4; hex 80000002; asc     ;;
     1: len 4; hex 80000002; asc     ;;
    
    Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
     0: len 4; hex 80000003; asc     ;;
     1: len 4; hex 80000003; asc     ;;
    
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 1890 page no 4 n bits 72 index UNI_C1 of table `test`.`tb1001` trx id 15312 lock_mode X waiting
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
     0: len 4; hex 80000001; asc     ;;
     1: len 4; hex 80000001; asc     ;;
    
    *** WE ROLL BACK TRANSACTION (1)
    
    
  • 相关阅读:
    字符个数统计
    面试题——字符的左右移动
    5. Longest Palindromic Substring
    Linux- AWS之EC2大数据集群定时开关机
    Openldap- 大机群身份验证服务
    Linux- 自动备份MySQL数据库脚本
    Linux- 运维
    JAVA- 切换默认的Java
    HIVE- 新建UDF范例
    Hadoop- 集群启动详解
  • 原文地址:https://www.cnblogs.com/gaogao67/p/14634999.html
Copyright © 2020-2023  润新知