• MYSQL-GAP&插入意向锁 死锁记录


    1、建表:

    1. CREATE TABLE `test_dead_lock` (
    2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
    3.   `user_id` bigint(20) unsigned NOT NULL COMMENT 用户id',
    4.   `user_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
    5. `type` int(10) DEFAULT '0' COMMENT '类型',
    6.   PRIMARY KEY (`id`),
    7.   UNIQUE KEY `unique_idx` (`user_id`,`user_name`),
    8.   KEY `idx_name` (`user_name`)
    9. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='测试死锁表';

    mysql 5.7,事务隔离级别RR,会话自动提交事务关闭【set autocommit=off;】

    2、数据准备

    1. INSERT INTO `test_dead_lock` (`id`, `user_id`, `user_name`, `type`)
    2. VALUES
    3. (1,1,'name22',0),
    4. (2,2,'name22',0),
    5. (3,3,'name3',0),
    6. (4,4,'name22',0),
    7. (9,8,'name8',0),
    8. (12,10,'name10',0),
    9. (41,10,'name100',0),
    10. (64,11,'name11A',0),
    11. (65,12,'name12A',0);

    3、事务处理

    事务1事务2备  注
    start transaction;
    start transaction;

    delete from test_dead_lock

    where user_id=5 ;

    不存在数据,加间隙锁

    delete from test_dead_lock

    where user_id=6 ;

    不存在数据,加间隙锁

    insert ignore into test_dead_lock

    (user_id,user_name)
    values

    (5,'name5A'),(5,'name5AA');

    加插入意向锁,等待2事务间隙锁释放

    insert ignore into test_dead_lock

    (user_id,user_name)
    values

    (6,'name6A'),(6,'name6AA');

    加插入意向锁,等待1事务间隙锁释放

    死锁

    rollback;rollback;

    备注:也可以直接 delete 13,14,插入13,14数据来验证,间隙锁范围是正无穷。

    4、死锁日志

    show engine innodb status;

    5、涉及知识点:

     (1)mysql 事务隔离级别

    (2)mysql 锁

  • 相关阅读:
    JavaScript 基础
    鼠标键盘管理 ShareMouse for Mac最新
    pagmo并行全局多目标优化算法库的安装编译与使用
    【JAVA】SpringBoot
    从零上手双指针
    时间序列预测的输入
    Kotlin
    每天新内容
    接口自动化之测试数据动态生成并替换
    总结vue 需要掌握的知识点
  • 原文地址:https://blog.csdn.net/zhaoxinglin123/article/details/127410956