定义
锁主要是为了在并发情况下协调多个进程或线程针对某个资源的访问.(mysql就是使用锁和MVCC实现了隔离机制)
一、锁的分类方式
锁可以从 性能(实现思想),操作类型,数据粒度.
二、分类
1.性能(实现思想)
- 乐观锁
乐观锁指的是对于数据库的读写处于乐观的态度.它默认认为数据库不会发生冲突.只有在数据提交的时候检测。常见的实现方式:增加一个version字段.
在更新数据的时候判断version版本是否一致. - 悲观锁
悲观锁指的是对于数据的读写持悲观态度.即在读写数据的时候都会加锁.
它主要通过数据库的机制类实现.如在mysql中 select … for update
2.操作类型
- 读锁
读锁又称为共享锁(或S锁),针对同一份数据可以加多个读锁. - 写锁
写锁又称为排他锁(或X锁),针对同一份数据在加了写锁后,如果未释放会阻塞其他的写锁或写锁
读锁之间不互斥
写锁之间互斥
读写锁之间互斥
3.锁的粒度
-
表锁
表锁指的是针对整个表数据进行加锁或释放锁.表锁分为
表锁(表共享锁/表独占锁)
元数据锁(MDL) -
行锁
在数据行上对数据进行加锁和释放锁. -
页面锁
也称为页级锁.就是在页对数据进行加锁和释放锁. -
间隙锁(Gap lock)
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时, InnoDB会给符合条件的已有数据记录的索引项加锁.对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)” -
临键锁(next-key lock)
行锁和间隙锁的组合.