zoukankan      html  css  js  c++  java
  • MySQL Lock--并发插入导致的死锁

    ============================================================================

    测试脚本:

    表结构:
    CREATE TABLE `t1` (
    `i` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`i`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    会话1:
    begin;
    INSERT INTO t1 VALUES(1);
    
    会话2:
    begin;
    INSERT INTO t1 VALUES(1);
    
    
    会话3:
    begin;
    INSERT INTO t1 VALUES(1);
    
    
    会话1执行ROLLBACK,会话2和会话3产生死锁

    ============================================================================

    案例分析

    案例分析:
    当会话1未提交时,对插入的记录持有X排它锁,会话2和会话2检测到记录存在,但由于会话1处于未提交状态,不能判定会话2和会话3主键冲突, 会话2和会话3的执行成功与否取决于会话1提交还是回滚,因此会话2和会话3改为申请该记录的共享锁,由于记录上有X排他锁,因此会话2和会话3等待共享锁。
    
    等会话1发生回滚,会话2和会话3会立即获得共享锁,然后会话2和会话3分别尝试插入,申请对记录持有X排他锁,因为对方会话持有S共享锁,申请X排他锁锁被阻塞,引发死锁检查并触发死锁。

    参考: INSERT加锁规则

  • 相关阅读:
    Solr 配置连接数据库
    最大利润
    分割金条的最小代价
    民居点亮
    一个会议室最多安排几场宣讲
    N皇后问题
    Integer的缓存机制
    Windows快捷键
    二叉树中两个节点的最低公共祖节点
    判断二叉树是不是完全二叉树
  • 原文地址:https://www.cnblogs.com/gaogao67/p/10412249.html
Copyright © 2011-2022 走看看