本文会按照多种角度分别描述MySQL数据库下的锁,通过了解数据库的锁机制可以在应用程序中合理的运用锁避免并发或者避免锁来提高效率
锁级别分类描述
- 共享锁 ,读锁,只有在读和读之间可以重入,在无法获得锁的情况下需要堵塞,会堵塞其他事务更新
- 排它锁 ,写锁,不可以重入,在无法获得锁的情况下需要堵塞,会堵塞其他事物更新和读取
- 意向锁 ,有读锁和写锁,由于共享锁和排它锁都可以针对行,在事务中如果涉及到多表操作,可能在不同事务内会造成死锁的问题,MySQL为了避免锁的冲突,使用意向锁,事务A在申请一行的行锁的时候,数据库会先自动申请意向锁,事务B在申请排它锁的时候会先查看表是否被其他事务加了表锁,然后再查看表是否加了意向共享锁,如果有,事务B申请表排它锁的步骤会被堵塞,只存在表锁
- 间隙锁 ,写锁,不可以重入,为了避免幻读的情况出现,主要出现在同一个事务先Delete再Insert的情况下,数据库扫描索引,发现Delete的数据是一个间隙锁,然后就会向左右各扫描到一个值,锁住整个区间内的数据,会造成死锁的出现
锁粒度分类描述
行锁 | 页锁 | 表锁 | |
---|---|---|---|
锁范围 | 当前操作行 | 当前操作行相邻的一组数据 | 当前表 |
开销 | 最大 | 折中 | 最小 |
并发度 | 最低 | 折中 | 最高 |
死锁 | 会 | 会 | 不会 |
加锁方式分类描述
显式加锁
1
2select * from table where id=1 lock in share mode;--共享锁
select * from table where id=1 for update;--排它锁自动加锁,数据库在执行事务的时候自动进行加锁
操作方式分类描述
- DDL锁 (Data Manipulation Language)数据操控语言,针对数据库中的数据进行操作
- DML锁 (Data Definition Language)数据库定义语言,针对表的结构、数据类型、约束等关系进行操作
- DCL锁 (Data Control Language)数据库控制语言,针对数据库的用户和权限进行操作
从使用方式进行加锁
- 乐观锁
- 悲观锁