mysql锁 转
参考文章:https://blog.csdn.net/puhaiyang/article/details/72284702
一.mysql锁的结构图
如上图所示,针对mysql的innodb存储引擎,mysql锁包括了乐观锁和悲观锁。而悲观锁又包括共享锁和排它锁,共享锁/排它锁里又有行锁和表锁的实现,下面一个个说明他们的内容。
二.锁详解
1.乐观锁
乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。然后update的时候,where子句里,增加version值的判断,如果update返回的值是0,说明是版本号冲突,如果是1,则更新成功。
举个例子,例如要更新一个用户的数据
(1)查出用户的数据(假设根据uid查询),sql为:select id,name,mobile,version from user_db.t_user_info where uid=1024;
假设查出来的数据为
(2)假设要更新name字段为lisi,则sql为:update user_db.t_user_info set name='lisi',version=4 where uid=1024 and version=3;
如果这时候更新的结果是1,则更新成功;如果为0,则需要用户重新操作
2.悲观锁
悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。另外与乐观锁相对应的,悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。
mysql的悲观锁包括共享锁和排它锁。
先简单介绍什么是共享锁和排它锁:共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁;而排它锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。
举个简单形象的例子来说明一下:共享锁就像是你家的大门钥匙,除了你有,你家人也有;而排它锁则像是试衣间,我进来了别人就不能进来了。
再来说说什么是行锁和表锁。
顾名思义,行锁获取数据库某一行的锁,而表锁就是获取某张表的锁。
下面更详细说明他们的用法。
(1)共享锁
刚刚说了,对于悲观锁,一般数据库已经实现了,共享锁也属于悲观锁的一种,所以,mysql自身对共享锁的功能是有实现的。
A.对于共享锁来说,一个事务获取了某一行的共享锁,则其他事务还可以继续获取这一行的共享锁,但是不能获取这行的排它锁。
B.如何获取某一行/表的共享锁。在select语句后面加 lock in share mode,即可获取共享锁。例如,sql为:
begin;
SELECT * from city where id = "1" lock in share mode;
C.值得注意的一点,在有事务获取了共享锁之后,其他事务是不能做insert/update/delete,因为insert/update/delete语句,是自动加上排它锁的
D.如何判断获取的是行锁还是表锁
SELECT * from city where id = "1" lock in share mode; 这个sql里,如果id这个字段带了索引,则获取的是行锁,否则获取的是表锁
ps:共享锁又称读锁
(2)排它锁
mysql自身对排它锁的功能也是有实现的
A.对于排它锁来说,一个事务获取了某一行的共享锁,其他事务不能再获取任何锁(包括共享锁和排它锁)
B.如何获取某一行/表的排它锁。在select语句后面加 for update,即可获取排它锁。例如,sql为:
begin;
SELECT * from city where id = "1" lock in share mode;
C.如何判断获取的是行锁还是表锁和共享锁是一样的
D.insert/update/delete语句,是自动加上排它锁的
ps:排它锁又称写锁
(3)行锁
行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
使用行级锁定的主要是InnoDB存储引擎。
(4)表锁
表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。
当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。
关于行锁和表锁,前面在共享锁和排它锁里已有说明,这里只提一点,慎用表锁,即select for update语句,where子句务必带上索引,否则极容易造成性能问题
————————————————
版权声明:本文为CSDN博主「无名草110」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mweibiao/java/article/details/80746453
mysql锁 转的更多相关文章
- mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...
- Mysql锁初步
存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...
- mysql锁表机制及相关优化
(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...
- MySQL锁系列3 MDL锁
http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...
- 01 MySQL锁概述
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- MySQL锁等待分析【2】
MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...
- MySQL锁与MVCC
--MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...
- MySQL锁总结
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...
- Mysql锁机制--并发事务带来的更新丢失问题
Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...
随机推荐
- selenium+python对表格数据的操作
一.直接获取整个表格数据,包含表头 def table_info(self): tr_data=[] table_data=[] css='id=>useradmin'#根据表格id找到表格 s ...
- mysql数据库常见问题修改(待补充)
1.修改mysql最大连接数的方法:临时修改:1.使用命令show variables 来查看当前最大连接数 show variables like '%max_connections%'; 使用命令 ...
- [计算机网络]图解HTTP阅读笔记
总述 书的定位:一本十分浅显的HTTP书籍,主要介绍了HTTP与HTTPS.适合入门了解,很多地方都是蜻蜓点水,但稍微深入的地方能让人了解重点在哪,后面应该有针对性地阅读深入书籍. 主要内容:介绍了T ...
- RFID了解
转载自为什么大家都抛弃传统标签选择RFID电子标签? rfid电子标签是一种非接触式的自动识别技术,它通过射频信号来识别目标对象并获取相关数据,识别工作无需人工干预,作为条形码的无线版本,RFID技术 ...
- hystrix(5) 延时检测
hystrix在执行命令的同事,会对执行延时进行检测,如果超过设置的延时时间,那么将停止执行,并返回fallback执行结果. if (properties.executionTimeoutEnabl ...
- 《Netty权威指南》笔记
第1章 Java的I/O演进之路 1.1 Linux网络I/O模型 fd:file descriptor,文件描述符.linux内核将所有外部设备都看作一个文件来操作,对文件的读写会调用内核提供的命令 ...
- 解决 webpack .\src\main.js .\dist\bundle.js 错误
打包的命令格式:webpack 要打包的文件的路径 打包好的输出文件的路径 栗子: webpack .\src\main.js .\dist\bundle.js 提示错误,错误信息如下: 错误原因 w ...
- 我给VSCode报了个bug,微软工程师竟然凌晨回复了...
柠檬哥整理了50本计算机相关的电子书,关注公众号「后端技术学堂」,回复「1024」即可获取,回复「进群」拉你进读者技术交流群. 本文首发个人微信公众号,欢迎围观点击阅读原文 最近遇到一个有意思的bug ...
- 解决 SecureCRT 和 SecureFX 中文乱码
引言 最近老是有小伙伴给我发消息说,下载的 SecureCRT 和 SecureFX 安装打开后连接了自己的服务器或虚拟机后会出现中文乱码,每次都要给一一回复,我倒没事,主要是有时候因为工作的原因,所 ...
- POI和easyExcel
POI与easyExcel 这个东西一般用来做什么? 将用户信息导出为Excel表格(导出数据) 将Excel表中的信息录入到网站数据库(比如一些习题上传) 在开发过程中会遇到对Excel的处理,比如 ...