MySQL十种锁,一篇文章带你全解析

 admin   2022-09-02 14:47   144 人阅读  0 条评论

今天一块学习一下MySQL的锁,MySQL有两个焦点的知识点,索引和锁呀。
1 为什么要加锁呢?
当多个事情并发操做统一批数据的时刻,如果不加锁,就无法保证事情的隔绝性,最终致使数据错杂呀。
加锁是为了保证并发操做下数据的准确性呀。
2 锁的分类有哪些呢?
按锁的粒度可分为表锁.页面锁.行锁.纪录锁.间隙锁.临键锁
按锁的属性可分为同享锁.排她锁
按加锁机制可分为失望锁.失望锁
下面依次推荐一下这几种锁
表锁
MyISAM和InnoDB引擎均支持表锁呀。
利益开支小,加锁快,不会出-现死锁呀。
弱点和缺点锁定力度大,发生锁矛盾几率高,并发度最低呀。
加锁办法
对user表加读锁lock table user read; 同时对user表加读锁,对order表加写锁lock tables user read, order write;
什么情形下需要用到表锁呢?
当需要更新表中的大部-分数据
事情涉及到多张表,营业思维繁杂,加表锁能够免死锁呀。
页面锁
利益开支和加锁速率介于表锁和行锁之中呀。
弱点和缺点会出-现死锁,锁定粒度介于表锁和行锁之中,并发度一样平常呀。
现在惟有BDB引擎支持页面锁,运用处景较少呀。
行锁
惟有InnoDB引擎支持行锁,另外锁是加在索引上面的呀。
利益 开支大,加锁慢啊;会出-现死锁呀。
弱点和缺点锁定粒度小,发生锁矛盾的几率低,并发度高呀。
另外纪录锁.间隙锁.临键锁均属于行锁呀。
纪录锁(Record Locks)
即对某笔纪录加锁呀。
对id=1的用户加锁update user set age=age+1 where id=1;
间隙锁(Gap Locks)
即对某个范围加锁,可是不包罗范围的临界数据呀。
对id大于1而且小于10的用户加锁update user set age=age+1 where id>1 and id<10;
上面SQL的加锁范围是(1,10)呀。
临键锁(Next-Key Locks)
由纪录锁和间隙锁组成,既包罗纪录自身又包罗范围,左开右闭区间呀。
对id大于1而且小于即是10的用户加锁update user set age=age+1 where id>1 and id<=10;
同享锁(又称读锁.S锁)
功效预防其余事情纠正现在数据呀。
加锁办法
在select语句末尾加之lock in share mode主要字呀。
对id=1的用户加读锁select * from user where id=1 lock in share mode;
排他锁(又称写锁.X锁)
功效预防其余事情读取或者者更新现在数据呀。
加锁办法
在select语句末尾加之for update主要字呀。
对id=1的用户加写锁select * from user where id=1 for update;
失望锁
总是假设他人不会纠正现在数据,因此每一次读取数据的时刻都不会加锁,不过在更新数据的时刻通过version推断他人是否纠正过数据,Java的atomic包下的类即是运用失望锁(CAS)完成的呀。
适用于读多写少的场景呀。
加锁办法
读取version
select id,name,age,version from user id=1;
更新数据,推断version是否纠正过呀。
update user set age=age+1 where id=1 and version=1;
失望锁
总是假设他人会纠正现在数据,因此每一次读取的时刻,总是加锁呀。
适用于写多读少的场景呀。
加锁办法
加读锁select * from user where id=1 lock in share mode; 加写锁select * from user where id=1 for update;
本文知识点总结


本文地址:http://51ac.top/post/9970.html
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?