@JunQiu
2018-09-23T16:46:42.000000Z
字数 1604
阅读 3165
summary_2018/09 mysql
## 行锁Record Lock:单个行记录上的锁,我们通常讲的行锁,它的实质是通过对索引的加锁实现;只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。在事务隔离级别为读已提交下,仅采用Record Lock。## 间隙锁Gap Lock:锁定一个范围(即记录间的间隙,阻止插入防止幻读的发生),但不包含记录本身。见下图:

mysql> desc t;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| a | int(11) | YES | | NULL | |+-------+---------+------+-----+---------+-------+// 事务Amysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from t;+------+| a |+------+| 4 || 4 |+------+2 rows in set (0.00 sec)// 更新或者删除操作,会加gap锁,且由于A不是索引,会锁住全表mysql> update t set a=2 where a=1;Query OK, 0 rows affected (0.00 sec)Rows matched: 0 Changed: 0 Warnings: 0---- 事务B ----mysql> INSERT INTO Persons VALUES (4);// 陷入锁等待,直到A提交或者lock等待超时---- 事务B ----mysql> select * from t;+------+| a |+------+| 4 || 4 |+------+2 rows in set (0.00 sec)
