MySQL中的锁类型丰富多样,可以根据不同的分类标准来划分。以下是对MySQL中锁类型的详细归纳,以及对乐观锁和悲观锁的具体解释:
一、MySQL中的锁类型
1. 按锁的粒度划分
- 表锁:开销小,加锁快;锁定力度大,发生锁冲突的概率高,并发度最低;不会出现死锁。
- 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
- 页锁(页面锁):开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度也介于表锁和行锁之间,并发度一般。
2. 按锁的模式划分
- 共享锁(S锁):又称读锁,允许一个事务读取一行数据,但不允许其他事务对该行数据增加排他锁。即一个事务给某行数据加了读锁,其他事务也可以读,但是不能写。
- 排他锁(X锁):又称写锁,允许当前事务对数据行进行增删改查操作,不允许其他事务对增加了排他锁的数据行增加共享锁和排他锁。即一个事务给某行数据加了写锁,其他事务不能读,也不能写。
3. 按锁的算法划分
- 记录锁(Record Lock):对索引记录加锁,锁定的是索引记录而不是物理记录。
- 间隙锁(Gap Lock):对索引记录之间的间隙加锁,防止其他事务在这个间隙中插入新记录。
- 临键锁(Next-Key Lock):记录锁和间隙锁的组合,用于解决幻读问题。它锁定的是索引记录以及索引记录前面的间隙。
此外,还有意向锁(分为意向共享锁和意向排他锁),这是表级锁,用于支持InnoDB的多粒度锁,解决表锁和行锁共存的问题。
二、乐观锁和悲观锁
1. 乐观锁
- 定义:乐观锁并不是真正的锁,而是采用一种乐观的并发控制策略。它假设在大多数情况下,并发事务之间不会发生冲突。
- 实现方式:通常是通过在数据表中增加一个版本号(version)字段来实现的。在更新数据时,会检查当前事务的版本号是否大于数据库表中对应记录的版本号,如果是,则进行更新操作,并将版本号加1;否则,认为发生了并发冲突,不进行更新。
- 应用场景:适用于读多写少的场景,如电商系统中的商品浏览次数统计。
2. 悲观锁
- 定义:悲观锁持一种悲观的态度,认为在并发环境中,数据很可能会被其他事务修改。因此,在事务开始时,就对要操作的数据进行加锁,直到事务完成并提交或回滚后才释放锁。
- 实现方式:在MySQL中,可以使用
SELECT ... FOR UPDATE
语句来实现悲观锁。该语句会对满足条件的记录进行加锁,其他事务在尝试对这些记录进行更新操作时会被阻塞。 - 应用场景:适用于写多读少且对数据一致性要求极高的场景,如银行系统的转账操作。
综上,MySQL中的锁类型多样,可以根据实际需求选择合适的锁类型来提高数据库的并发性能和数据一致性。同时,乐观锁和悲观锁作为两种重要的并发控制机制,各自适用于不同的应用场景。
标签:事务,加锁,记录,乐观,并发,悲观,MySQL From: https://blog.csdn.net/x1234w4321/article/details/144566278