mysql知识点

2022/2/8 19:18:01

本文主要是介绍mysql知识点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、锁

锁的目的:并发控制,根据加锁的范围,划分为:全局锁、表级锁、行锁。

全局锁
定义:给整个数据库实例加锁
命令:Flush tables with read lock,该命令使得整个库处于只读状态,其他语句被阻塞:数据更新语句、数据定义语句和更新类事务的提交语句。
使用场景:全库逻辑备份。

表级锁
mysql里面表级锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)

1)表锁
语法:lock tables … read/write,可以用unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。
注意点:lock tables语句除了限制别的线程读写外,也限制了本线程接下来操作的对象。
示例:
如果在某个线程 A 中执行 lock tables t1 read, t2 write; 这个语句,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能访问其他表。

2)元数据锁(MDL)
用法:不需要显式使用,在访问一个表的时候被自动加上,当对一个表做增删改查操作的时候,加MDL读锁,当对表结构进行变更时,加MDL写锁
作用:保证读写的正确性
注意点:
安全给小表加字段,首先需解决长事务,事务不提交,就会一直占着MDL锁,如果要做DDL变更的表刚好有长事务在执行,先暂停DDL执行或者kill掉这个长事务
查看是否有长事务执行:

select * from information_schema.innodb_trx;

行锁
定义:针对数据表中行记录的锁
注意:mysql的行锁是在引擎层由各个引擎自己实现的,并不是所有的引擎都支持行锁,比如MyISAM引擎不支持行锁,Innodb支持行锁。
逻辑:在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,这个就是两阶段锁协议。
应用注意点:
1)如果事务需要锁多行,要把最可能造成锁冲突,最可能影响并发度的锁的申请时机尽量往后放
2)调整语句顺序并不能完全避免死锁,因此引入了死锁和死锁检测的概念。减少死锁的主要方向,就是控制访问相同资源的并发事务量。

死锁
定义:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,导致这几个线程进入无限等待

策略:
1)等到直到超时,超时时间可以通过参数innodb_lock_wait_timeout来设置,下图展示设置为50s

show variables like 'innodb_lock_wait_timeout';

在这里插入图片描述

2)死锁检测,发现死锁后,主动回滚死锁链条中的一个事务,让其他事务得以继续执行,将参数innodb_deadlock_detect设置为on,表示开启这个逻辑

show variables like 'innodb_deadlock_detect';

在这里插入图片描述



这篇关于mysql知识点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程