热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL高级MySQL锁机制

概述定义:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发


  1. 概述

    • 定义:

       



      • 锁是计算机协调多个进程或线程并发访问某一资源的机制。
        在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发
        访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说
        锁对数据库而言显得尤其重要,也更加复杂。








    • 锁的分类:

      • 从对数据操作的类型(读\写)分:

        1. 读锁(共享锁):针对同一-份数据,多个读操作可以同时进行而不会互相影响。



          • 建表插入数据

            • 技术分享图片



          • session1为表mylock加读锁。

          • 手动上锁:lock table 表名字  read(write), 表名字2 read(write),其他;

          • 查看表中所有的锁:show open tables;

          • 释放表:unlock tables;

          • 技术分享图片

          • 技术分享图片




































          • session01


            session02


            为mylock加读锁


            session1为表mylock加读锁。

            lock table mylock read;

            技术分享图片


            连接终端

            技术分享图片


            读mylock


            当前可以读mylock表:  select * from mylock;

            技术分享图片


            其他session也可以查mylock表: select * from mylock;

            技术分享图片


            读其他表

            写其他表


            当前session不能查询其他的表:select * from user;

            当前session不能更新其他的表:insert into user(name,age) values(‘zzz‘,18);

            技术分享图片


            其他session可以查询其他未枷锁的表:  select * from user;

            其他的session可以写其他未加锁的表: insert into user(name,age) values(‘ylm‘,18);

            技术分享图片


            更新myclock


            当前session插入或更新mylock都会报错: insert into mylock(name) values(‘zs‘);

            技术分享图片


            其他session插入或更新mylock会一直等待获得锁(阻塞):

            insert into mylock(‘name‘)values(‘ls‘);

            技术分享图片


            释放锁


            释放锁:unlock tables;

            技术分享图片


            获得锁,插入或更新操作完成

            技术分享图片






        2. 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。



















































          • session01session02
            添加写锁当前session为mylock表添加写锁:lock table mylock write;打开终端
            写mylock

            当前session为mylock插入数据:insert into mylock(name) values(‘sdf‘);

            技术分享图片


            其他session写mylock表等待(阻塞):insert into mylock(name) values(‘sdf‘);

            技术分享图片


            释放锁

            当前session释放写锁:unlock tables;


            插入成功:

            技术分享图片


            添加写锁

            当前session为mylock表添加写锁:lock table mylock write;


            打开终端


            读mylock

            当前sessoin读mylock表:

            技术分享图片


            其他session读mylock表等待:select * from mylock;

            技术分享图片


            释放锁

            当前session释放读锁:unlock tables;


            获得锁读取mylock完成:

            技术分享图片


             添加锁 当前session添加读锁:lock table mylock write; 打开终端
             读取其他的没有加锁的表

             当前的session读取和插入其他未加索的表:

            select * from user;

            insert into user(name,age) values(‘fdsf‘,18);

            不能读取和插入数据

            技术分享图片


             当前的session读取和插入其他未加索的表:

            select * from user;

            insert into user(name,age) values(‘fdsf‘,18);

            可以插入和读取数据

            技术分享图片

             






        3. 结论:简而言之

          1. MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁



          2. MySQL的表级锁有两种模式:
            表共享读锁(Table Read L ock)
            表独占写锁(Table Write Lock)

























          3. 锁类型是否可兼容读锁写锁
            读锁
            写锁


          4. 结论:
            结合上表,所以对MyISAM表进行操作,会有以下情况:
            1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
            2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操





        4. 简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁则会把读锁和写锁都堵塞。



        5. 查看表的锁结构命令分析:



          • 看看哪些表被加锁了
            mysq|l>show open tables; ;



          • 如何分析表锁定
            可以通过检查table_ locks_ waited和table_ locks_ immediate状态变量来分析系统上的表锁定:
            SQL: show status like ‘table%‘;



          • 这里有两个状态变量记录MySQL内部表级锁定的情况,两个变量说明如下:
            Table_ _locks_ immediate: 产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1 ;
            Table_locks__waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况;



          • 此外,Myisam的读写锁调度是写优先,这也是myisam不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞






      • 从对数据操作的粒度分:



        • 表锁



        • 行锁





      •   



         











推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 使用Jsoup解析并遍历HTML文档时,该库能够高效地生成一个清晰、规范的解析树,即使源HTML文档存在格式问题。Jsoup具备强大的容错能力,能够处理多种异常情况,如未闭合的标签等,确保解析结果的准确性和完整性。 ... [详细]
author-avatar
手机用户2602906131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有