锁
全局锁
对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML写语句、DDL语句已经更新操作的事务提交语句都将被阻塞。
例:做全库的逻辑备份,对所有表进行锁定,从而获取一致性视图,保证数据的完整性。
加锁语句:flush tables with read lock;
释放语句:unlock tables;
表级锁
在MyISAM、InnoDB、BDB等存储引擎中。
分类:
- 表锁
-
- 加锁语句:lock tables 表名 read/write
-
- 解锁语句: lock tables/客户端断开连接
-
- 表共享读锁
-
-
- 读锁不会影响其他客户端的读操作,但是会影响自身和其他客户端的写操作。
-
-
- 表独占写锁
-
-
- 写锁不会影响自身的读和写操作,但是会影响其他客户端的读和写操作。
-
- 元数据锁
-
- 避免DML与DDL冲突,保证读写的正确性。
- 意向锁
-
- 为了避免DML在执行时,加的行锁与表锁冲突,在InnoDB中引入了意向锁,这样表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
-
- 意向共享锁:与表锁共享锁(read)兼容,与表排它锁互斥。
-
- 语句:由语句 select .... lock in share mode。
-
- 意向排他锁:与表锁排它锁和共享锁都互斥,意向锁之间不会互斥。
-
- 语句:由insert、update、delete、 select...for update添加。
行级锁
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,不是对数据加锁。
- 行锁
-
- 锁定单个记录的锁,防止其他事务对此进行update和delete,在RC和RR隔离级别下都支持。
-
- 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,会自动优化为行锁。
-
- 如果根据索引没有检索到该数据,会加间歇锁。
-
- InnoDB行锁是针对索引加锁的,不通过索引检索数据,InnoDB将对表中的所有记录加锁,升级为表锁。
-
- 共享锁(s):允许一个事物去读一行,阻止其他事务获取相同数据集的排它锁。
-
- 排它锁(x):允许获取排它锁的事务更新数据,组织其他事务获取相同数据集的共享锁和排它锁
SQl | 行锁类型 | 说明 |
---|---|---|
INSERT | 排它锁 | 数据库自动加锁 |
UPDATE | 排它锁 | 数据库自动加锁 |
DELETE | 排它锁 | 数据库自动加锁 |
select(正常) | 数据库不会加任何锁 | |
lock in share mode | 共享锁 | 手动添加共享锁 |
select...for update | 排它锁 | 手动添加排它锁 |
- 间隙锁
-
- 锁定索引记录间隙(不包括该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读,在RR隔离级别下支持。
-
- 例:id为索引,6-12之间的索引中添加间隙锁。
- 临键锁
-
- 行锁与间隙锁的组合,同时锁住数据,并锁住数据前面的间隙,在RR隔离级别下支持。