MyISAM 和 InnoDB 锁总结
发布日期:2021-10-06 02:38:38 浏览次数:6 分类:技术文章

本文共 914 字,大约阅读时间需要 3 分钟。

为什么要用锁?

你在试衣间试衣服,没有锁,别人就会推门进来,场面会很尴尬!!!

什么是锁?

  1. 锁是计算机协调多个进程或线程并发访问某一资源的机制;
  2. 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素;
  3. 锁对数据库而言显得尤其重要,也更加复杂。

Mysql 中的锁?

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
  • 页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

锁的使用场景?

  • 表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,可以考虑使用MyISAM锁;
  • 行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,可以考虑使用InnoDB锁.

MyISAM 锁-- 表级锁

MySQL 的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)
  None(无锁时) 读锁 写锁
读锁
写锁

 

  读锁 写锁
同session

读当前被锁表:可读

读当前被锁表别名表: 报错

写当前被锁表:报错

读其他表:报错

写其他表:报错

读当前被锁表:报错

读当前被锁表别名表: 报错

写当前被锁表:可写

读其他表:报错

写其他表:报错

不同session

读当前被锁表:可读

写当前被锁表:等待

读其他表:可读

写其他表:可写

读当前被锁表:等待

写当前被锁表:等待

读其他表:可读

写其他表:可写

InnoDB 锁--行级锁

注:必须有索引才能实现,否则会自动锁全表!!!

  读锁 写锁
同session

可读

可写

id= 1加写锁

不同session

可读

允许读

写id= 1的数据,等待

写id != 1的数据,可写

写 非索引列查询条件数据,等待

加锁

可加读锁

不可加任何锁

 

如何释放锁?

执行Begin,commit,或者rollback

 

 

 

 

 

 

 

 

 

转载地址:https://blog.csdn.net/luxuiary/article/details/106547078 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:给你两个整数,n 和 start 。数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。
下一篇:给你一个长度为 n 的整数数组 nums,其中 n大于1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

发表评论

最新留言

很好
[***.229.124.182]2024年04月16日 20时14分08秒