`
OuYangGod
  • 浏览: 53767 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

MySQL InnoDB锁机制(一)

阅读更多

MySQL InnoDB一共有四种锁:共享锁(读锁,S锁)、排他锁(写锁,X锁)、意向共享锁(IS锁)和意向排他锁(IX锁)。其中共享锁与排他锁属于行级锁,另外两个意向锁属于表级锁。

 

  • 共享锁(读锁,S锁):若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放S锁。
  • 排他锁(写锁,X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务不能再对A加作何类型的锁,直到T释放A上的X锁。
  • 意向共享锁(IS锁):事务T在对表中数据对象加S锁前,首先需要对该表加IS(或更强的IX)锁。
  • 意向排他锁(IX锁):事务T在对表中的数据对象加X锁前,首先需要对该表加IX锁。

比如SELECT ... FROM T1 LOCK IN SHARE MODE语句,首先会对表T1加IS锁,成功加上IS锁后才会对数据加S锁。

同样,SELECT ... FROM T1 FOR UPDATE语句,首先会对表T1加IX锁,成功加上IX锁后才会对数据加X锁。

MySQL InnoDB 锁兼容阵列
  X IX S IS
X
IX
S
IS

 

 

MySQL官网上有个死锁的例子,但分析得过于概括,这里我们详细分析一下。

首先,会话S1以SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE查询,该语句首先会对t表加IS锁,接着会对数据(i = 1)加S锁。

 

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (1.07 sec)

mysql> INSERT INTO t (i) VALUES(1);
Query OK, 1 row affected (0.09 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.10 sec)
 接着,会话S2执行DELETE FROM t WHERE i = 1,该语句尝试对t表加IX锁,由于IX锁与IS锁是兼容的,所以成功对t表加IX锁。接着继续对数据(i = 1)加X锁,但数据已经被会话S1事务加了S锁了,所以会话S2等待。

 

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM t WHERE i = 1;
 接着,会话S1也执行DELETE FROM t WHERE i = 1,该语句首先对t表加IX锁,虽然会话S2已经对t表加了IX锁,但IX锁与IX锁之间是兼容的,所以成功对t表加上IX锁。接着会话S1会对数据(i = 1)加X锁,此时发现会话S2占有的IX锁与X锁不兼容,所以会话S1也等待。就这样,会话S1等S2释放IX锁,而会话S2等S1释放S锁,从而死锁发生。
mysql> DELETE FROM t WHERE i = 1;
Query OK, 1 row affected (0.00 sec)

mysql>
 会话S2发生死锁。
mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
mysql>
 
分享到:
评论
1 楼 fellowming 2016-02-26  
官网对这个死锁的原因是,S1申请X锁时,S2优先提出申请X锁,所以被阻塞:
好像跟你的解释不大一致:
"接着会话S1会对数据(i = 1)加X锁,此时发现会话S2占有的IX锁与X锁不兼容,所以会话S1也等待。"
因为看到你的解释我想到:
两个同时执行的Insert语句:
Trx1:INSERT INTO t (i) VALUES(1);
Trx2:INSERT INTO t (i) VALUES(1);
理论上Trx1 跟Trx2 都可以各自正常申请到 IX锁;
但是问题来:
Trx1 申请 x锁时,会不会于 Trx2所持有的 IX不兼容,而导致死锁呢???
而事实上是不造成死锁!!!
希望你能解答解答

相关推荐

    mysql事务与锁机制(存储引擎和锁、MyISAM锁机制、InnoDB锁机制、Next-Key锁、Dead-Lock).docx

    #### 三、InnoDB锁机制 **1、事务基础概念** 事务是数据库操作的基本单位,确保数据的一致性和完整性。InnoDB支持ACID特性(原子性、一致性、隔离性、持久性),并通过多种锁机制来实现这些特性。 **2、锁机制...

    MySQL8.0锁机制和事务

    锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们直接影响着数据库系统的性能和可靠性。 锁机制的种类: MySQL 8.0 中的锁机制可以...

    InnoDB锁机制学习笔记

    MySQL的引擎简介,InnoDB的锁机制与事务隔离级别

    MySQL高级 锁机制

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...

    mysql insert锁机制1

    在MySQL的InnoDB存储引擎中,插入操作不仅涉及到行级锁,还可能涉及Gap锁和Next-Key Locks,这些锁机制的设计是为了防止幻读(Phantom Read)和其他并发问题。 1. 数据库版本:文中提到的是MySQL 5.6.27。不同版本...

    MySQL的锁机制解析

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于保证数据的一致性和完整性起着至关重要的作用。本文将深入解析MySQL中的锁机制,帮助读者理解其工作原理,为面试准备或日常数据库管理提供有力支持...

    mysql索引和锁机制简介

    关于mysql中的innodb存储引擎的索引机制简介,详细介绍了锁机制

    MySQL:锁机制.pdf

    在MySQL中,锁机制是保障数据操作安全的重要组成部分,其主要分为表锁、行锁和间隙锁。本知识点详细解读了MySQL锁机制的定义、分类、特点以及具体的应用案例。 1. 锁的定义和分类 在数据库系统中,锁是用来控制多...

    MYSQL锁机制全揭秘

    页面锁是BDB存储引擎所采用的一种锁机制,它介于表级锁和行级锁之间。页面锁的开销和加锁时间位于表锁和行锁之间,会出现死锁,并且并发度一般。但随着InnoDB存储引擎的普及,页面锁的存储引擎已经逐渐被取代,不再...

    MYSQL锁机制

    #### 一、MySQL锁机制概述 MySQL中的锁机制是数据库管理系统用于控制并发事务对数据资源访问的关键技术之一。合理地管理和利用锁机制能够有效地防止数据不一致性和提高系统的并发处理能力。MySQL支持多种锁类型,...

    mysql 5.6 新特性-innodb

    InnoDB 是 MySQL 最常用的存储引擎之一,在 MySQL 5.6 中得到了显著的增强,特别是在性能和功能方面。 ##### 性能优化 1. **Read-Only Transactions(只读事务)**: - **第一层优化**:通过区分只读事务与更新...

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    深入学习《MySQL内核:InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型...

    mysql内核 innodb存储引擎

    《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...

    辛星笔记之InnoDB锁

    关于InnoDB锁机制的一些常见问题: - **死锁:** 如何避免死锁?InnoDB如何处理死锁? - **性能影响:** 使用不同的锁类型对系统性能有何影响? - **最佳实践:** 开发者应如何选择合适的锁类型以最大化并发性和...

Global site tag (gtag.js) - Google Analytics