mysql中的锁,mysql中有哪些锁
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。
锁定的目的在于确保共享资源在任何时候只由一个线程访问,从而避免导致共享数据故障的多个线程的问题。
分类:
按操作数据分类粒度:全球锁,表层锁,行锁
按数据操作类型分类:
悲观锁:读锁(共享锁)和写锁(单独锁)不支持同步; 最佳锁定:支持多个线程,事务不排队,数据可以修改,但数据需要一个版本号,必须与修改前和修改后的版本号相匹配,否则它会反转(修改和验证先),如在线文档优化锁定只在冲突的概率非常低和额外锁定的成本非常高的情况下考虑。按锁的级别分类:
高级锁:读锁、写锁 低级锁: 相互厌恶锁, 自旋锁(所有悲观锁)高级别锁可以由低级别锁实现,例如读写锁,可以通过选择相互排斥锁或者基于自旋锁实现。
1. 全局锁
执行后,整个数据库处于只读状态,DQL查询可用,DML和DDL不可用。
场景:
全球锁主要用于备份整个库的逻辑,这样数据或表结构不会更新,备份文件不会与预期不同。
缺点:规模太大无法导致企业停滞
上锁:flush tables with read lock; 解锁:unlock tables;
2. 表锁
支持InnoDb和MyISAM;低成本、快速锁定、大粒度、高冲突概率、低共发生率;
上锁: 锁定表表名读取;(读锁) 锁定表的表名;(写锁)
解锁: unlock tables;
注:当该表被锁定时,不能在此会议上写(DML, DDL)
3. 行锁
InnoDb参数支持行级锁定,MyISAM不支持,开支大,锁定慢,粒子大小小,冲突概率低,共发生率高;
上锁: select... where... lock in share mode; select... where... for update;
3.逆锁和自旋锁
当一个线程被锁定时,另一个线程将失败,相互锁定和自旋锁定在处理失败锁定时不同:
当相互排斥锁定失败时,线程将释放CPU给其他线程; 自旋锁未能添加锁后,线程将忙于等待直到获得锁;互斥锁:相互锁是专用锁.例如,当线程A成功锁定时,此时,互锁已经排斥于线程A,只要线条A不释放手上的锁,B线锁定将失败,所以你释放CPU,然后把它交给其他线程,因为线程B已经释放了CPU,自然线程B锁定的代码将被封锁。由于相互锁定和额外锁定的失败导致的锁定现象,它由操作系统内核实现。当加锁失败时,内核将线程置于睡眠状态,等到锁被释放后,核将在正确的时刻唤醒线程,当该线程成功获得锁定时,然后可以继续实施。所以,互斥锁加锁失败时,从用户到内核,让内核帮助我们改变线程,同时简化使用锁的难度,但性能开支也有一定成本。
自旋锁:当使用自旋锁时,当多个线程竞争锁时,那些未能添加锁的线程将“匆忙等待”。旋转锁是最简单的锁,不断旋转并使用CPU周期直到锁可用。但是,如果锁定代码执行太长,旋转线程使用CPU资源需要很长时间。
比较:自旋锁与使用水平的相互锁类似,但实现完全不同:在锁定失败时,相互锁用“线交换器”响应,自旋锁则用“繁忙等待”响应。
这两个方法都是处理锁的最基本方法,而更先进的锁将选择其中一个实现,例如读写锁可以选择相互厌恶锁实现或基于旋锁实现。
场景:妥协锁定和锁定失败将取代线程并增加成本;如果锁定代码的执行时间短,你应该选择自旋锁定,而等待时间短,成本小;
参考:https://blog.csdn.net/qq_34827674/article/details/108608566https://xiaolincoding.com/mysql/lock/mysql_lock.html#%E5%85%A8%E5%B1%80%E9%94%81
XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com