InnoDB存储引擎中的锁

  • 表级锁

    • 表级别的S锁X锁

      • 在对某个表执行SELECTINSERTDELETEUPDATE语句时,InnoDB存储引擎是不会为这个表添加表级别的S锁或者X锁
    • 表级别的IS锁IX锁
      • 当我们在对使用InnoDB存储引擎的表的某些记录加S锁之前,那就需要先在表级别加一个IS锁,当我们在对使用InnoDB 存储引擎的表的某些记录加X锁之前,那就需要先在表级别加一个IX锁IS锁IX锁的使命只是为了后续在加表级别的S锁X锁时判断表中是否有已经被加锁的记录,以避免用遍历的方式来查看表中有没有上锁的记录
    • 表级别的AUTO-INC锁
      • 在使用MySQL过程中,我们可以为表的某个列添加AUTO_INCREMENT属性,之后在插入记录时,可以不指定该列的值,系统会自动为它赋上递增的值
  • 行级锁:
    • 行锁,也称为记录锁 ,顾名思义就是在记录上加的锁
    • 行锁类型
      • Record Locks:有S锁X锁之分,当一个事务获取了一条记录的S型记录锁后,其他事务也可以继续获取该记录的S型记录锁,但不可以继续获取X型记录锁;当一个事务获取了一条记录的X型记录锁后,其他事务既不可以继续获取该记录的S型记录锁,也不可以继续获取X型记录锁
      • Gap Locks:可以用于解决可重复读级别下的幻读问题,防止插入幻影记录
      • Next-Key Locks: 锁住某条记录同时又可以阻止其他事务在该条记录前边的间隙插入新纪录,其是Record Locksgap Locks的合体它既能保护该条记录,又能阻止别的事务将新记录插入被保护记录前边的间隙
      • Insert Intention Locks:一个事务在插入一条记录时需要判断一下插入位置是不是被别的事务加了所谓的gap锁,若存在,插入操作需要等待,直到拥有的gap锁对应的事务提交,事务在等待的时候也需要在内存中生成一个锁结构,表明有事务想在某个间隙中插入新纪录,但是现在在等待。这种类型的锁命名为Insert Intention Locks,也成为插入意向锁
      • 隐式锁:一个事务在执行INSERT操作时,如果即将插入的间隙已经被其他事务加了gap锁,那么本次INSERT操作会阻塞,并且当前事务会在该间隙上加一个插入意向锁,否则一般情况下INSERT操作是不加锁的

内存结构

  • 加锁的本质就是在内存中创建一个锁结构与之关联

    • 对于需要放在同一个锁结构中的情况

      • 在同一个事务中进行加锁操作
      • 被加锁的记录在同一个页面中
      • 加锁的类型是一样的
      • 等待状态是一样的
  • 锁结构
    • 锁所在的事务信息: 不论是表锁还是行锁,都是在事务执行过程中生成的,哪个事务生成了这个锁结构,这里就记载着这个事务的信息。其本质是一个指针,通过该指针可以找到内存中关于该事务的更多信息
    • 索引信息:对于行锁来说,需要记录一下加锁的记录是属于哪个索引的
    • 表锁/行级信息
      • 表锁:记载着这是对哪个表加的锁,还有其他的一些信息
      • 行锁:记载了三个重要的信息
        • Space ID :记录所在表空间。
        • Page Number :记录所在页号。
        • n_bits :对于行锁来说,一条记录就对应着一个比特位,一个页面中包含很多记录,用不同的比特位来区分到底是哪一条记录加了锁。为此在行锁结构的末尾放置了一堆比特位,这个n_bits属性代表使用了多少比特位
    • type_mode:这是一个32位的数,被分成了lock_modelock_typerec_lock_type三个部分
      • 锁的模式( lock_mode ),占用低4位

        • LOCK_IS(十进制的0):表示共享意向锁,也就是IS锁
        • LOCK_IX(十进制的1):表示独占意向锁,也就是IX锁
        • LOCK_S(十进制的2):表示共享锁,也就是S锁
        • LOCK_X(十进制的3):表示独占锁,也就是X锁
        • LOCK_AUTO_INC(十进制的4):表示AUTO-INC锁
      • 锁的类型( lock_type ),占用第5〜8位,不过现阶段只有第5位和第6位被使用:
        • LOCK_TABLE(十进制的16),也就是当第5个比特位置为1时,表示表级锁。
        • LOCK_REC(十进制的32),也就是当第6个比特位置为1时,表示行级锁
      • 行锁的具体类型(rec_lock_type),使用其余的位来表示。只有在lock_type的值为LOCK_REC时,也就是只有在该锁为行级锁时,才会被细分为更多的类型:
        • LOCK_ORDINARY(十进制的0):表示next-key锁 。
        • LOCK_GAP(十进制的512):也就是当第10个比特位置为1时,表示gap锁 。
        • LOCK_REC_NOT_GAP(十进制的1024):也就是当第11个比特位置为1时,表示记录锁
        • LOCK_INSERT_INTENTION(十进制的2048):也就是当第12个比特位置为1时,表示插入意向锁

【mysql】- 锁篇(下)的更多相关文章

  1. 精通MySQL之锁篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  2. mysql什么情况下会触发表锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  3. (6)MySQL进阶篇SQL优化(MyISAM表锁)

    1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...

  4. (11)MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)

    1.概述 前面章节之所以介绍那么多锁的知识点和示例,其实最终目的就是为了排查与解决死锁的问题,下面我们把之前学过锁知识重温与补充一遍,然后再通过例子演示下如果排查与解决死锁. 2.前期准备 ●数据库事 ...

  5. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  6. 「MySQL高级篇」MySQL锁机制 && 事务

    大家好,我是melo,一名大三后台练习生,最近赶在春招前整理整理发过的博客~! 引言 锁锁锁,到哪到离不开这桩琐事,并发琐事,redis琐事,如今是MySQL琐事,这其中琐事,还跟MySQL另一个重要 ...

  7. v80.01 鸿蒙内核源码分析(内核态锁篇) | 如何实现快锁Futex(下) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(内核态锁篇) | 如何实现快锁Futex(下) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

  8. 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)

    本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...

  9. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  10. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

随机推荐

  1. Mysql报错Error Code: 1175. You are using safe update

    使用MySQL执行update的时候报错:Error Code: 1175. You are using safe update mode and you tried to update a tabl ...

  2. 35 _ 队列1 _ 什么是队列.swf

    队列是一种可以实现一个先进先出的存储结构 什么是队列? 队列(Queue)也是一种运算受限的线性表.它只允许在表的一端进行插入,而在另一端进行删除.允许删除的一端称为队头(front),允许插入的一端 ...

  3. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  4. LeetCode 80,不使用外部空间的情况下对有序数组去重

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第49篇文章,我们一起来看LeetCode的第80题,有序数组去重II(Remove Duplicates fr ...

  5. Python3-apscheduler模块-定时调度

    from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler from apschedule ...

  6. 弹性盒模型中flex-grow 和flex的区别

    在flex弹性盒模型体系中,flex-grow和flex都有对子元素进行放大的作用,但是这两个属性在放大时的计算方法不同,在使用时候要注意,使用正确的放大属性,从而达到自己想要的效果. 先来看下两个属 ...

  7. SpringBoot--使用socket搭建聊天室

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. IDEA开发工具使用 git 创建项目、拉取分支、合并分支

    转载自:https://blog.csdn.net/qq_39470733/article/details/80366435 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有 ...

  9. python字典套字典

    定义字典 familyinfo = { "family name":"Python", "family structure":[ {&quo ...

  10. python文件处理-根据csv文件内容,将对应图像拷贝到指定文件夹

    内容涉及:文件遍历,读取csv指定列,拷贝文件,清理和创建文件 # -*- coding: utf-8 -*- import csv import os import sys import numpy ...