mysql进阶之锁

nuist__NJUPT nuist__NJUPT     2023-03-07     105

关键词:

锁是计算机中协调多个进程或线程并发访问资源的一种机制。在数据库中,除了传统的计算资源竞争之外,数据也是一种提供给许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决堆的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。故锁对数据库而言,显得极为重要。

目录

1、锁的概述

2、全局锁

3、表级锁

4、行级锁

 5、小结


1、锁的概述

MySQL中按照锁的粒度分为三种,全局锁,表级锁,行级锁。

2、全局锁

如果对全库进行数据备份,就需要加上全局锁,使得处于只读状态,从而保证数据的完整性。

 为了保证备份的数据一致性,需要加上全局锁,备份结束之后,释放全局锁。

加上全局锁后,存在两点问题,在主库备份,备份期间不得更新,一些业务要停止;如果通过MySQL主从复制实现读写分离,备份期间,从库不能执行从主库拷贝过来的二进制日志,导致主从延迟。

3、表级锁

表级锁锁定粒度是每张表,表级锁主要分为三类,表锁,元数据锁,意向锁。

我们先看一下表锁,表锁分为表共享读锁,表独占写锁。读锁加锁后,当前客户端可读不可写,其余客户端可读,写的话会被阻塞,直至当前客户端释放锁。写锁加锁后,当前客户端可读可写,其它客户端不可读也不可写,会一直阻塞到锁释放。

我们再看一下表级锁中的元数据锁,它是为了避免DML语言和DDL语言的冲突,在表上有活动事务的时候,不可以对元数据进行写入操作,执行DML的时候,加MDL读锁,执行DDL的时候,加MDL排他写锁,执行DQL语言,加MDL写锁。

事务执行过程中,不同客户端执行DML和DDL语句,锁会冲突,避免读写的不一致性。

我们最后再看一下表级锁的意向锁,在InnoDB引擎中使用意向锁来避免执行表锁之前对每一行都要进行是否加行锁检查。

客户端需要对表进行加锁的时候,不需要逐行检查是否有行锁,只需要根据意向锁进行判定是否可以加表锁即可,意向锁分为意向共享锁(DQL),意向排他锁(DML).

 意向共享锁和表锁共享锁兼容,与表锁排他锁互斥。意向排他锁与其它锁都互斥。

4、行级锁

MySQL的行级锁主要分为三类:行锁,间隙锁,临键锁。行锁是锁住单个行记录,间隙锁是索引记录的间隙,防止其它事务在这个间隙进行insert。临键锁,行锁和间隙锁的结合,同时锁住数据和数据前面的间隙。

 行锁分为共享锁和排它锁,共享锁和共享锁是兼容和排他锁冲突,排它锁和其它锁都互斥。

针对唯一索引进行检索,对已存在的记录进行等值匹配的时候,将会自动优化为行锁,InnoDB行锁是对索引加索,不通过索引检索数据,行锁将会升级为表锁。InnoDB使用临界锁进行搜索和索引扫描,防止出现幻读。

间隙锁的目的就是防止其它事务插入间隙,间隙锁可以共存,如果是唯一索引(主键索引)上的等值查询,如果更新一条之前不存在的记录,会在两条记录之间加上间隙锁,此时,这个间隙其它客户端不能执行DML操作。

 5、小结

mysql之锁

鉴于CSDN对版权保护的不作为以及落后的运营手段,本博客将于近期关闭,并清空全部文章。原有文章将会经过再次的校对、整理,转移至本人在简书的博客空间。 查看详情

mysql原理篇之锁--14(代码片段)

Mysql原理篇之锁--14解决并发事务带来问题的两种基本方式一致性读(ConsistentReads)锁定读(LockingReads)共享锁和独占锁锁定读的语句写操作多粒度锁MySQL中的行锁和表锁其他存储引擎中的锁InnoDB存储引擎中的锁InnoD... 查看详情

mysql高级之锁

MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-levellocking);BDB存储引擎采用的是页面锁&#... 查看详情

高性能mysql之锁机制

并发控制 并发控制的任务是确保当多个事务同时修改数据库中同一个数据时,不破坏事务的隔离性和一致性。锁 当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证... 查看详情

mysql进阶

1.二进制格式mysql安装//下载二进制格式的mysql软件包[root@20liuzhenchao~]#cd/usr/local/[root@localhostsrc]#wget[[email protected]local]#wgethttps://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12- 查看详情

java之锁-volatile

锁是JAVA多线程关键,也是面试中必问的,在此好好总结一下。(先要从进程和线程说起,此处先欠下,回头专门说一下操作系统是怎么管理进程和线程的)说到多线程就要说说JAVA的内存模型:图片来自于网络。  Java内存模型... 查看详情

java之锁-cas

 CAS是什么?  CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。  CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V... 查看详情

多线程之锁机制(代码片段)

前言  在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是先给共享资源上锁,... 查看详情

java并发之锁的使用浅析

    锁像synchronized同步块一样,是一种线程同步机制。让自Java5开始,java.util.concurrent.locks包提供了另一种方式实现线程同步机制——Lock。那么问题来了既然都可以通过synchronized来实现同步访问了,那么为什... 查看详情

sqlite剖析之锁和并发控制

   在SQLite中,锁和并发控制机制都是由pager.c模块负责处理的,用于实现ACID(Atomic,Consistent,Isolated和Durable)特性。在含有数据修改的事务中,该模块将确保或者所有的数据修改全部提交,或者全部回滚。与此同时,该模... 查看详情

java并发优化之锁lock

一.synchronized的缺陷  synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?  在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的... 查看详情

java并发优化之锁lock

一.synchronized的缺陷  synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?  在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的... 查看详情

春华秋实之mysql进阶-06mysql管理(代码片段)

9MySQL管理9.1系统数据库系统自带数据库mysql>showdatabases;+--------------------+|Database|+--------------------+|information_schema||mysql||performance_schema||sys|+--------------------+各自的功能mysql:存储MySQL服务器正常运行所 查看详情

mysql进阶实战11,查询缓存

...慎四、如何分析和配置查询缓存五、InnoDB和查询缓存MySQL进阶实战系列文章哪吒精品系列文章一、查询缓存是什么?MySQL查询缓存保存查询返回的完整结果,当查询命中该缓存,MySQL会立刻返回结果,跳过解析、优... 查看详情

java多线程与并发模型之锁

这是一篇总结Java多线程开发的长文。文章是从Java创建之初就存在的synchronized关键字引入,对Java多线程和并发模型进行了探讨。希望通过此篇内容的解读能帮助Java开发者更好的理清Java并发编程的脉络。互联网上充斥着对Java多线... 查看详情

mysql进阶(代码片段)

一、MySQL的多实例安装以前一些很low的方法就是解压两个mysql,分别放到不同的文件夹。其实mysql已经考虑到了多实例的安装情况,也有相应的脚本命令的支持。现需要装两个mysql,一个3307,一个3308。1、新建/etc/my.... 查看详情

mysql进阶篇(代码片段)

MySQL基础篇2.1数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。2.1.1数值类型2.1.2日期和时间类型2.1.3字符串类型整型?tinyint,占1字... 查看详情

数据库小技能:oracle基础之锁(代码片段)

文章目录I锁1.1锁定数据行1.2锁类型II事务2.1事务ACID特性2.2事务控制语句I锁什么是锁?锁(lock)机制用于管理对共享资源的并发访问。1.1锁定数据行forupdate和forupdatenowait是对操作的数据行进行加锁,在事务提交前防止其他操作对数... 查看详情