@JunQiu
2018-09-24T00:46:42.000000Z
字数 1604
阅读 2832
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 | |
+-------+---------+------+-----+---------+-------+
// 事务A
mysql> 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)