首页 数据库 mysql教程 MySQL数据库锁机制

MySQL数据库锁机制

Jun 07, 2016 pm 05:27 PM
mysql数据库 mysql锁机制

表级锁,各大存储引擎粒度最大的锁级别,实现简单,获取锁和释放锁的速度快,也避免了死锁的问题,但同时带来了锁资源竞争的问题

所谓锁,为保证数据的一致性,对共享资源的在被并发访问变得有序的一种规则。

不同的MySQL存储引擎,有不同的锁机制或锁实现;总的来所,使用了三种锁级别,行级锁(row-level)、页级锁(page-level)、表级锁(table-level),依次锁定的资源粒度逐渐减小,锁资源是随着锁定资源粒度的减小,锁定同样数据需要的内存数量越来越多,算法也越来越负责,但同时应用程序遇到锁等待的可能也越来越底,系统的整体并发行随之提高;

表级锁,各大存储引擎粒度最大的锁级别,实现简单,获取锁和释放锁的速度快,也避免了死锁的问题,但同时带来了锁资源竞争的问题,导致并发度较底;表级锁分为读锁和写锁,MySQL通过四个队列来维护这两种锁定,两个存放当前正被锁定中的读和写的信息,两个存放等待读和写的信息,这四个队列分别为:read->lock\read_wait->lock->write->lock/write_wait->lock;读锁定,当前请求获取锁定的资源没有被写锁定,也没有在写锁定等待队列中有优先级更高写锁等待,立即进入read->lock,如果不满足,进入read_wait->lock;写锁定,当前请求写的资源没有被写锁定,并且没有在写锁定等待队列里面,那么再检测是否在读等待队列里面,如果有,进入写等待队列,如果没有,进入当前写队列;使用表级锁的通常是一些非事务性的存储引擎,如MyISAM、Memory、CSV等

页级锁,MySQL中毕竟特殊的一种锁级别,粒度介于行级锁和表级锁之间,获取和释放锁资源的负担也介于行级锁和表级锁之间,并发性同样也介于行级锁和表级锁之间,和行级锁一样,页级锁也可能发生死锁;主要是BerkeleyDB存储引擎是锁定方式;

行级锁,是RMDB实现的锁定粒度最小的锁,发生资源竞争的概率最小,,能够给提供尽可能大的并发处理从而提供应用的性能。但同时由于颗粒度小,导致获取和释放锁需要的消耗也最大。另外,行级锁最容易发生死锁;行级锁定不是由MySQL实现的,而是由存储引擎实现的,如InnoDB和MySQL的分布式存储引擎NDBCluster等;InnoDB的行级锁同样分为两种,共享锁和排他锁,同样InnoDB也引入了意向锁(表级锁)的概念,所以也就有了意向共享锁和意向排他锁,所以InnoDB实际上有四种锁,即共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX);

如果某些资源已经有了一个共享锁,那么在这些资源上面可以添加其他的共享锁,但不能添加排他锁;如果某些资源已经有了一个排他锁,那么在这些资源上不能添加其他的排他锁和共享锁,只能等待当前锁的释放,并获取锁资源后,才能对其加锁,但可以对其添加意向锁,即如果等待事务想要添加的是排他锁,那么可以在锁定行的所在表添加意向排他锁,如果等待事务想要添加的是共享锁,那么可以在锁定行所在表添加意向共享锁;InnoDB的锁实现与Oracle的锁实现有很大的不同,总的来说,Oracle锁定数据是根据某行记录所在的物理block上的事务槽上表级锁定信息,而InnoDB的锁定则是通过指向数据记录的第一条索引之前和最后一条索引之后的空域空间上标记锁信息来实现的,所以InnoDB的这种锁实现有被称为“Next Key Locking”(间隙锁),间隙锁一个比较大的弱点是,当锁定一定范围的键值后,即使一些不存在的键值也回被无辜的锁定,导致这种键值的记录不能被insert。当然,这种情况只会出现在InnoDB的默认的事务隔离级别repeatable-read才会出现,如果降低InnoDB的事务隔离级别为read commited则不会出现这样的情况。InnoDB给出的解释是间隙锁可以阻止幻读的出现,但其实间隙锁只能阻止部分幻读的情况,但不能阻止全部。通过索引来实现锁的方式还有一个更大的隐患是,当Query不能使用索引时,行级锁将会上升为表级锁,会将整张数据表锁住,造成并发性能的降低。

死锁,行级锁可能产生死锁,InnoDB也不例外。InnoDB有一套检测死锁的机制,但前提是死锁的场景涉及的存储引擎都是InnoDB的时候。如果InnoDB检测到死锁的存在,那么就将影响数据行数最小的个事务回滚。

那么有什么办法来避免InnoDB的间隙锁带来的麻烦吗?有三种办法:1、降低并发,避免出现资源竞争,但这样会在一定程度上降低应用的性能;2、修改InnoDB的默认的事务隔离级别,由repeatable-read修改为read commited,当然修改事务隔离级别带来的另外一个隐患就是可能会出现不可重复读;3、在查询数据是,一定要使用索引,避免全表扫描,在insert数据时,使用增长的索引字段(即每次插入的索引字段的值一定保证是增长的)。

linux

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP开发实践:使用PHPMailer发送邮件到MySQL数据库中的用户 PHP开发实践:使用PHPMailer发送邮件到MySQL数据库中的用户 Aug 05, 2023 pm 06:21 PM

PHP开发实践:使用PHPMailer发送邮件到MySQL数据库中的用户引言:在现代互联网建设中,邮件是一种重要的沟通工具。无论是用户注册、密码重置,还是电子商务中的订单确认,发送电子邮件都是必不可少的功能。本文将介绍如何使用PHPMailer来发送电子邮件,并将邮件信息保存到MySQL数据库中的用户信息表中。一、安装PHPMailer库PHPMailer是

Go语言和MySQL数据库:如何进行数据冷热分离处理? Go语言和MySQL数据库:如何进行数据冷热分离处理? Jun 18, 2023 am 08:26 AM

随着数据量的不断增加,数据库的性能成为了一个越来越重要的问题。数据冷热分离处理是一种有效的解决方案,它可以将热点数据和冷数据进行分离,从而提高系统的性能和效率。本文将介绍如何使用Go语言和MySQL数据库进行数据冷热分离处理。一、什么是数据冷热分离处理数据冷热分离处理是一种将热点数据和冷数据进行分类处理的方式。热点数据是指访问频率高、对性能要求高的数据,冷数

如何使用MySQL数据库进行时间序列分析? 如何使用MySQL数据库进行时间序列分析? Jul 12, 2023 am 08:39 AM

如何使用MySQL数据库进行时间序列分析?时间序列数据是指按照时间顺序排列的数据集合,它具有时间上的连续性和相关性。时间序列分析是一种重要的数据分析方法,可以用于预测未来趋势、发现周期性变化、检测异常值等。在本文中,我们将介绍如何使用MySQL数据库进行时间序列分析,并附上代码示例。创建数据表首先,我们需要创建一个数据表来存储时间序列数据。假设我们要分析的数

MySQL数据库技能培养到什么程度能够成功就业? MySQL数据库技能培养到什么程度能够成功就业? Sep 12, 2023 pm 06:42 PM

MySQL数据库技能培养到什么程度能够成功就业?随着信息化时代的快速发展,数据库管理系统成为各行各业不可或缺的重要组成部分。而MySQL作为一种常用的关系型数据库管理系统,具有广泛的应用领域和就业机会。那么,MySQL数据库技能需要培养到什么程度,才能够成功就业呢?首先,掌握MySQL的基本原理和基础知识是最基本的要求。MySQL是一款开源的关系型数据库管理

使用Go语言进行MySQL数据库的数据增量备份的方法 使用Go语言进行MySQL数据库的数据增量备份的方法 Jun 17, 2023 pm 02:28 PM

随着数据量的增加,数据库的备份变得越来越重要。而对于MySQL数据库,我们可以借助Go语言实现自动化的增量备份。本篇文章将简单介绍如何使用Go语言进行MySQL数据库的数据增量备份。一、安装Go语言环境首先,我们需要在本地安装Go语言环境。可以前往官网下载相应的安装包并进行安装。二、安装相应的库Go语言提供了许多访问MySQL数据库的第三方库,其中较为常用的

如何使用MySQL数据库进行图像处理? 如何使用MySQL数据库进行图像处理? Jul 14, 2023 pm 12:21 PM

如何使用MySQL数据库进行图像处理?MySQL是一种强大的关系型数据库管理系统,除了用于存储和管理数据之外,它还可以用于图像处理。本文将介绍如何使用MySQL数据库进行图像处理,并提供一些代码示例。在开始之前,请确保已经安装了MySQL数据库,并且已经熟悉了基本的SQL语句。创建数据库表格首先,创建一个新的数据库表格,用于存储图像数据。表格的结构可以如下所

如何使用Go语言进行可靠的MySQL数据库连接? 如何使用Go语言进行可靠的MySQL数据库连接? Jun 17, 2023 pm 07:18 PM

随着大量的数据需要存储和处理,MySQL已经成为了应用开发中最常用的关系型数据库之一。而Go语言由于其高效并发处理和简洁的语法,也越来越受到开发者的欢迎。本文就将带领读者通过Go语言实现可靠的MySQL数据库连接,让开发者能够更加高效地查询和存储数据。一、Go语言连接MySQL数据库的几种方式Go语言中连接MySQL数据库通常有3种方式,分别是:1.第三方库

MySQL数据库和Go语言:如何进行数据缓存处理? MySQL数据库和Go语言:如何进行数据缓存处理? Jun 17, 2023 am 10:05 AM

近年来,Go语言越来越受到开发人员的青睐,成为开发高性能Web应用程序的首选语言之一。MySQL也作为一种流行的数据库,使用广泛。在将这两个技术结合起来使用的过程中,缓存处理是非常重要的一环。下面将介绍如何使用Go语言来处理MySQL数据库的缓存。缓存的概念在Web应用程序中,缓存是为了加快数据的访问速度而创建的一种中间层。它主要用于存储经常被请求的数据,以

See all articles