`
564467109
  • 浏览: 2570 次
社区版块
存档分类
最新评论

说说mysql的锁

 
阅读更多

       mysql提供了两种锁,一种使用select for update,一种mysql函数get_lock(str,timeout)。下面是我对其使用和一些肤浅的领悟:

       首先是select for update,特别说明,mysql现在依旧不支持 select for update no wait。。。

      测试环境如下:

==========================

数据库版本:

======================================

表结构(word_mood)



 

============================================================================================================================================

引擎:

 
 下面开始介绍其使用和应该注意事项:

大家请注意查看上图显示的引擎是innodb为默认,故我要测试使用的也就是InnoDB。从我勾选出来的可以看出,它支持事物,行级锁,外键。什么是行级锁,我想大家应该都很明白,我们

再通过一些例子来加深影响。首先我会开两个console来演示:

 

 

=================================

 



 

A客户端对message_id=5的数据进行select for update操作,B客户端也对message_id=5的进行select for update操作,大家应该都已经猜到了结果,我们还是来验证下是否正确。

 



 

========================================================

 



 大家请看上面的结果集,A客户端显示出message_id=5的结果,而B客户端在等待一段时间出现获取锁超时。说明for update具有锁表的功能,A客户端一直持有锁,并没有释放(事务没有提交),故B客户端在一定时间没有获取到锁则抛出了timeout异常。那么我们继续研究,此时是锁表还是锁行。

我会对message_id=1的数据for update。若是锁表此时,应该继续超时,若是锁行,则会显示出结果。大家请看下面:



 大家请看,此时我们查询出message_id=1的结果,说明当where条件是主键的时候for update是进行锁行的,那么当where条件不存在主键是锁表还是锁行呢。

我们继续来验证,此时我会对A客户端message_content=0的数据进行for update,B客户端message_content=1的数据for update。在这之前,我会把这两个客户端的事务commit,然后重新开启事务



 

========================================================================



 

 

大家看上图,发现客户端B结果是empty set,说明A客户端执行的for update锁住word_mood这张表了。这也说明了当我们执行for update的时候若where条件是表的主键那么将只是锁住查询的那一行的数据,而不存在主键则是锁住整张表。那么又有同学会问,既然for update是锁行,能否对其他行进行操作呢?我将通过下面的试验展示给大家,在这之前我会commit掉A,B客户端,重新开启事务.

 



 

====================================================================



 

在上面的例子中我对A客户端的message_id=0数据进行了for update操作,然后在B客户端对message_id=5的数据进行了update,然后在insert了一条数据,均成功。说明我们锁住的只是当前行的update操作,而对其行没有影响。

 

现在我们再来看看get_lock(str,timeout)这个函数,这是mysql提供的,我们可以在开发中利用这个函数来堵塞线程。使用起来简单,但是坑也还是有的,只要明白了这个坑我们就可以在开发中避免。

我们先来说说这个函数的两个参数。第一个参数代表是要锁的字符串,第二个参数代表的是获取锁等待的时间。当返回值是1代表成功,0没有获取到值,null代表超时现在我就来演示如何使用,此时我会开两个console



 

=====================================

在上图中我首先用A客户端获取了一个lock锁,然后B客户端再去获取的时候,返回值为0。

既然有获取那么就有释放,函数release_lock(str)。参数代表要释放的锁;返回值:1成功,0,失败。

 

在下面的试验中,我会在A客户端释放锁(lock),B客户端继续获取锁



 

====================

 我们发现当A释放掉时,B才能获取到锁。这是正常释放和获取锁的方式。既然有正常那就有异常了,在此我希望大家能记住这个异常。。。因为在开发中我们一定要避免这个异常,否则会出现不可控的情况。下面我们就来试验下这个异常。



 

 

大家请看上图,我首先获取了一个lockA这个锁,然后使用is_free_lock函数(返回1-空闲;0-正在使用)查看锁的使用情况,发现正在使用,结果正常。然后在获取锁lockB,然后使用is_free_lock函数再次查看lockA的使用情况,发现其使用状态变成了空闲。而lockB处于正在使用。并没有出现lockA,lockB都处于正在使用状态,大家可以理解为,当我们再次lock一个新的字符串的时候,mysql就会把以前存在的锁释放掉,然后再获取当前这个新的锁。所以我们在开发的时候尽量使用常量并且必须调用release释放锁

 

 

  • 大小: 9.4 KB
  • 大小: 3.2 KB
  • 大小: 1.1 KB
  • 大小: 2.9 KB
  • 大小: 2.9 KB
  • 大小: 4.8 KB
  • 大小: 5.2 KB
  • 大小: 6.9 KB
  • 大小: 3.3 KB
  • 大小: 2.6 KB
  • 大小: 3.3 KB
  • 大小: 9.4 KB
  • 大小: 2.6 KB
  • 大小: 2.6 KB
  • 大小: 1.9 KB
  • 大小: 5.7 KB
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    常见(MySQL)面试题(含答案).docx

    数据库悲观锁和乐观锁的原理和应用场景? 如何做 MySQL 的性能优化? 索引是什么?MySQL为什么使用B+树,而不是使用其他?B+树的特点 创建索引时需要注意什么? CHAR和VARCHAR的区别? NOW()和CURRENT_DATE()有...

    mysql面试题(涉及索引、事务、锁)

    说说什么是最左匹配? 如何优化慢查询?(explain命令) 分库分表如何选择分表键 分库分表的情况下,查询时一般是如何做排序的? mysql分库分表,水平拆分和垂直拆分,水平拆分后如何路由 MySQL 索引使用的注意事项 ...

    mysql中的锁机制深入讲解

    本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,...

    MySql 索引、锁、事务知识点小结

    本文总结了MySql 索引、锁、事务知识点。分享给大家供大家参考,具体如下: 1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的记录。 索引的优点: 天生排序。 快速查找。 索引的缺点: 占用...

    Java面试系列-MySQL

    说说MySQL实现MVCC的原理??什么是MVCC? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务...

    一网打尽!关于mysql索引的基础与高级知识都在这里了

    本文取材于《高性能MySQL第三版》的第5章,由于索引使用了较多的比较复杂的...的时候,不知道你有没有想过,MySql是如何进行查找操作的,今天我就关于这句话,来说说MySql的索引策略, 索引类型 b-Tree索引 介绍 大多数

    2021互联网大厂Java架构师面试题突击视频教程

    上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程介绍: ...51_说说MySQL读写分离的原理?主从同步延时咋解决? 52_如何设计高可用系统架构?限流?熔断?降级?什么鬼!

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL千万级的大表要怎么优化(读写分离、水平拆分、垂直拆分).doc redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级.doc RPC (Remote ...

    招银网络java科技笔试题-mianjing:mianjing

    锁机制?实现维持map大小的LRU算法? volatile关键字?volatile修饰数组?修饰对象? 找两条链表公共节点? 如何判断循环链表? mysql索引?B+数搜索复杂度? mysql事务? 进程线程区别? 进程池? 进程几种状态?...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    说说你对Servlet的理解.mp4 │ Java面试题18.Servlet的生命周期.mp4 │ Java面试题19.forward和redirect的区别.mp4 │ Java面试题20.jsp和Servlet的相同点和不同点?.mp4 │ Java面试题21.内置对象和四大作用域和...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    ConcurrentHashMap的锁是读锁还是写锁? 69 【集合】HashMap与HashTable的区别 71 【多线程】什么是线程安全与非线程安全 72 【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口...

    送强力打狗棒,文末领取

    安全狗、云锁、D盾等软件waf,内置一套正则匹配检测规则。这类软件waf对恶意代码的认识很有限。例如安全狗iis版,只知道要防护的服务器是iis作为中间件,并不知道要防护的服务器上面部署的数据库类型[Mysql|Sql ...

    asp.net知识库

    在.NET访问MySql数据库时的几点经验! 自动代码生成器 关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--...

Global site tag (gtag.js) - Google Analytics