MySQL InnoDB锁机制(一)
来源:互联网 发布:iphone铃声下载软件 编辑:程序博客网 时间:2024/05/29 11:51
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 锁兼容阵列 XIXSISX✗✗✗✗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 transactionmysql>
0 0
- MySQL InnoDB锁机制(一)
- MySQL InnoDB 锁机制
- MySQL/InnoDB锁机制
- MYSQL-InnoDB 锁机制
- MySQL InnoDB锁机制(二)
- MySQL InnoDB锁机制(三)
- MySQL InnoDB 锁机制详解
- MySQL的InnoDB锁机制
- MySQL InnoDB 悲观锁机制
- Mysql InnoDB 锁机制学习
- MySQL- InnoDB锁机制
- MySQL innodb 锁测试(一)
- MySQL数据库InnoDB存储引擎中的锁机制(全面)
- MySQL innodb的锁机制解读
- Mysql中那些锁机制之InnoDB
- mysql innodb的锁机制分析
- Mysql中那些锁机制之InnoDB
- Mysql中那些锁机制之InnoDB
- 事务、事务并发
- 马上步入2015,写一篇新年计划吧!
- MySQL InnoDB隔离级别
- android坐标
- 我比较擅长网站类的编程,谈下自己的项目
- MySQL InnoDB锁机制(一)
- MySQL InnoDB非阻塞式读的实现原理
- MySQL InnoDB锁机制(二)
- hbase 异常 未解决
- MySQL InnoDB锁机制(三)
- 权限数据库设计
- Container With Most Water
- FreeRTOS源码解析 -> vTaskResume()
- 李开复:算法的力量