MySQL数据库的锁

it2022-06-27  83

1 锁

锁是计算机协调多个线程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算机资源的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。为了更好的应对高并发,封锁,时间戳、乐观锁、悲观锁都是并发控制采用的主要技术方式。

2 锁分类

操作划分: DML锁、DDL锁 按锁的粒度划分: 表级锁、行级锁、页级锁 按锁级别划分: 共享锁、排他锁 按加锁方式划分: 自动锁、显示锁 按使用方式划分: 乐观锁、悲观锁

3 锁的粒度划分

3.1 表级锁

表级锁分为表共享锁和表独占锁。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率最高,并发度最低。

3.2 行级锁

行级锁分为共享锁和排它锁。行级锁时MySQL中锁定粒度最细的锁。InnoDB引擎支持行级锁和表级锁,只有在通过索引条件检索数据的时候,才使用行级锁,否则就使用表级锁。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度最高。

3.3 页级锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级锁,一次锁定相邻的一组记录。BDB支持页级锁。开销和加锁时间介于表锁和行锁自建;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

4 锁级别划分

4.1 共享锁

共享锁又叫读锁,如果事务T对A加上共享锁,则其他事务只能对A再加共享锁,不能加其他的锁。获准共享锁的事务只能读数据,不能写数据。

用法:SELECT … LOCK IN SHARE MODE;

4.2 排它锁

排它锁又叫写锁,如果事务T对A加上共享锁,则其他事务都不能对A加任何类型的锁。获准排它锁的事务既能度数据,又能写数据。

用法:SELECT … FOR UPDATE

5 使用方式分

5.1 悲观锁

乐观并发控制和悲观并发控制是并发控制采用的主要方法。悲观锁:PCC Pessimistic Concurrency Controller。悲观锁是指在数据处理过程,使数据处于锁定状态,一般使用数据库的锁机制实现。备注:在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0。MySQL默认使用自动提交auto commit模式,也就是你执行一个更新操作,MySQL会自动将结果提交。悲观锁优缺点:悲观并发控制采用“先取锁再分” 的保守策略,为数据处理提供了安全的保证。但在效率方面,加锁机制会产生额外的开销,增加产生死锁的机会。

5.2 乐观锁

乐观锁:相对于悲观锁来说,乐观锁是通过记录数据版本的方式实现乐观锁。为数据增加一个版本标识,读取数据时,将版本标识一起读出,数据每更新一次,就对版本标识进行更新。乐观锁优缺点:乐观锁认为事务直接竞争的概率时很小的,在提交的时候才锁定,所有不会产生死锁。但是如果两个事务同时读取数据库的某一行,这时,就会发现乐观锁的弊端。

6 MySQL常用存储引擎的锁机制

BDB:支持行级锁和表级锁,默认是页级锁。InnoDB:支持行级锁和表级锁,默认是行级锁。MyISAM & Memory:都是采用表级锁。

最新回复(0)