行级锁 表级锁 乐观锁 悲观锁
行级锁
一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。行级锁之前需要先加表结构共享锁。
是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁分为共享锁和排他锁。
特点:加锁开销大,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高
表级锁
一般是指表结构共享锁锁,是不可对该表执行DDL(数据定义语言)操作,但对DML(数据操纵语言)操作都不限制。 表级锁是 MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了
使用场景:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。
乐观锁
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
对表的数据进行操作时,同时将数据表的版本字段取出,等到操作完毕进行提交时,将数据版本号与表内的数据版本号进行比较,如果相等,说明这段时间内没有别的事务对数据表进行操作,则将版本号加一,并予以更新。否则认为是过期数据,进行回滚。
使用场景:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。