MySQL十种锁,一篇文章带你全解析(应该对幻灯片中每项内容都进行动画设置)

  本篇文章为你整理了MySQL十种锁,一篇文章带你全解析(应该对幻灯片中每项内容都进行动画设置)的详细内容,包含有工资 滞纳金 应该对幻灯片中每项内容都进行动画设置 神探夏洛克第一季第三集最后怎么了 00后实力歌手排行榜 MySQL十种锁,一篇文章带你全解析,希望能帮助你了解 MySQL十种锁,一篇文章带你全解析。

   MySQL有两个核心的知识点,索引和锁。前几篇文章已经详细讲解了MySQL索引实现机制,今天再一起学习一下MySQL的锁。

  
MySQL有两个核心的知识点,索引和锁。前几篇文章已经详细讲解了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

  

 

  上面SQL的加锁范围是(1,10)。

  临键锁(Next-Key Locks):

  由记录锁和间隙锁组成,既包含记录本身又包含范围,左开右闭区间。

  

# 对id大于1并且小于等于10的用户加锁

 

  update user set age=age+1 where id 1 and id

  

 

  共享锁(又称读锁、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是否修改过。

  

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;

  

 

  本文知识点总结:

  文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。

  以上就是MySQL十种锁,一篇文章带你全解析(应该对幻灯片中每项内容都进行动画设置)的详细内容,想要了解更多 MySQL十种锁,一篇文章带你全解析的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: