锁机制概述
为了保证多用户并发操作时,被操作的数据资源能够保持一致性的设计原则,需要在用户进行数据操作时对指定资源加锁
MySQL数据库中的锁主要分为“表级锁”(如MyISAM存储引擎)和“行级锁”(InnoDB存储引擎),本文主要基于这两个存储引擎介绍表级锁和行级锁
表级锁和行级锁
表级锁是MySQL中锁的作用范围最大的一种锁,一旦用户对数据库中某个表T进行操作,那么整个表T将会被加锁,其他用户无法访问或操作表T中任何数据资源
优点:
- 有效避免死锁的发生
并发时只有一个用户能够获得表T的表级锁,其他用户只能等待,因此不存在死锁问题 - 加锁速度快,资源消耗小
用户对表T进行数据操作时表级锁只需要加一次,不需要频繁加锁释放锁
缺点: - 并发操作时发生锁冲突的概率大
由于表级锁的作用范围大,即锁的粒度大,在并发时出现多个用户等待一个用户释放锁的概率也大,资源竞争大
行级锁是MySQL中锁的作用范围最小的一种锁,当用户对表进行操作时,锁只加在表中用户操作所涉及到的一行或多行记录上,而不会使整个数据表被锁定
优点:
- 处理并发操作的能力较高,提高系统整体性能
行级锁相比表级锁有效减少了锁定资源竞争的发生
缺点: - 发生死锁的可能性更高
- 每次加锁和解锁消耗的资源更多
共享锁和排他锁
实际应用中,根据操作的不同,锁可以划分为读锁
和写锁
读锁表示用户读取操作时添加的锁,此时其他用户虽然不可以进行写操作(如更新数据、插入数据、删除数据等),但可以读取该数据资源,因此读锁也叫共享锁
写锁是用户进行写操作时添加的锁,此时其他用户对该数据资源既无法读也无法写,因此写锁也叫排他锁
隐式锁和显式锁
根据锁在MySQL中的状态,锁还可以分为隐式锁
和显式锁
,不管是MyISAM存储引擎表还是InnoDB存储引擎表,都可把锁按状态分为隐式锁和显式锁
隐式锁是当用户对存储引擎表进行读/写操作前,服务器会“自动”地为其添加一个表级的读/写锁;直到操作完毕,服务器再“自动”地为其解锁
显式锁由用户显式添加和释放