一、锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。分为全局锁、表级锁、行级锁。
二、全局锁
1、定义
全局锁就是对整个数据库实例加锁,加锁后后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞,整个实例就处于只读状态,即可以执行DQL语句,数据备份就是查询操作,数据进行了逻辑备份过程中,数据库数据不会发生变化,保证了数据的一致性和完整性。
2、具体操作
#添加全局锁
flush tables with read lock;#数据备份mysqldump -uroot –p1234 user > user . sql#释放锁unlock tables;
三、表级锁
1、定义
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。分为表锁、元数据锁、意向锁。
2、表锁
读锁:不会阻塞其他客户端的读,但是会阻塞写。
写锁:既会阻塞其他客户端的读,又会阻塞其他客户端的写。
#加锁
lock tables 表名 read/write
#释放锁
unlock tables
3、元数据锁
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
作用:为了避免DML与DDL冲突,保证读写的正确性。
当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享SHARED_READ / SHARED_WRITE,之间是兼容的。
当执行SELECT语句时,添加的是元数据共享锁SHARED_READ,会阻塞元数据排他锁EXCLUSIVE,之间是互斥的。
4、意向锁
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向共享锁(IS): 由语句select ... lock in share mode添加。与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。意向共享锁与表读锁是兼容的。
意向排他锁(IX): 由insert、update、delete、select...for update添加。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。意向排他锁与表读锁、写锁都是互斥的
一旦事务提交了,意向共享锁、意向排他锁,都会自动释放
#查看加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data fromperformance_schema.data_locks;
四、行级锁
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
1、行锁(Record Lock)
锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
SQL
|
行锁类型
|
说明 |
INSERT ... | 排他锁 |
自动加锁
|
UPDATE ... | 排他锁 | 自动加锁 |
DELETE ...
|
排他锁
|
自动加锁 |
SELECT(正常) |
不加任何锁
|
|
SELECT ... LOCK IN SHARE MODE
|
共享锁
|
需要手动在
SELECT
之后加
LOCK IN SHARE
MODE
|
SELECT ... FOR UPDATE
|
排他锁
|
需要手动在SELECT之后加FOR UPDATE |
默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜 索和索引扫描,以防止幻读。
针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时 就会升级为表锁。
#查看意向锁及行锁的加锁情况
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data fromperformance_schema.data_locks;
2、间隙锁&临键锁
默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。
索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。
注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会 阻止另一个事务在同一间隙上采用间隙锁。 文章来源:https://www.toymoban.com/news/detail-516264.html
五、范式
1、定义
设计表的依据。按照这个三范式设计的表不会出现数据冗余。文章来源地址https://www.toymoban.com/news/detail-516264.html
第一范式 | 第二范式 | 第三范式 |
任何一张表都应该有主键,并且每一个字段原子性不可再分 | 建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。 | 建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。 |
到了这里,关于MySQL数据库之锁、范式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!