热门标签 | 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不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞






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



        • 表锁



        • 行锁





      •   



         











推荐阅读
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
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社区 版权所有