search
HomeDatabaseMysql TutorialMySQL数据库锁机制
MySQL数据库锁机制Jun 07, 2016 pm 05:27 PM
mysql databasemysql lock mechanism

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

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

不同的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

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Go语言和MySQL数据库:如何进行数据冷热分离处理?Go语言和MySQL数据库:如何进行数据冷热分离处理?Jun 18, 2023 am 08:26 AM

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

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

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

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

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

如何使用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应用程序中,缓存是为了加快数据的访问速度而创建的一种中间层。它主要用于存储经常被请求的数据,以

使用Go语言进行MySQL数据库的数据迁移的方法使用Go语言进行MySQL数据库的数据迁移的方法Jun 17, 2023 am 09:01 AM

随着业务的增长和数据库版本升级等因素,数据库迁移变得越来越普遍。在进行数据迁移时,选择合适的工具和语言非常重要。本文将介绍如何使用Go语言进行MySQL数据库的数据迁移。安装MySQL驱动在使用Go语言进行MySQL数据库迁移前,需要首先安装MySQL驱动。在Go语言中,有很多MySQL驱动可供选择。在本文中,我们将选择最常用的官方MySQL驱动包-"dat

MySQL创建标签表实现文章标签功能的实现步骤MySQL创建标签表实现文章标签功能的实现步骤Jul 02, 2023 pm 04:17 PM

MySQL创建标签表实现文章标签功能的实现步骤标签是一种常用的分类方式,它可以帮助我们更好地组织和检索文章。在许多网站和应用程序中,都会有文章标签的功能。本文将介绍如何使用MySQL创建标签表,并实现文章标签的功能。步骤1:创建标签表首先,我们需要创建一个用于存储标签的表。在MySQL中,可以使用以下命令创建标签表:CREATETABLEtags(

使用Go语言进行MySQL数据库的数据导入导出过滤的方法使用Go语言进行MySQL数据库的数据导入导出过滤的方法Jun 17, 2023 pm 04:04 PM

随着互联网和大数据时代的到来,数据处理成为了一项必备的技能。MySQL作为目前世界上最流行的关系型数据库管理系统,一直以来在数据处理领域受到了广泛的应用。MySQL具有性能高、易用性好、灵活性强等优点,但数据导入导出过程中可能会存在重复或无效数据,因此本文将介绍如何使用Go语言进行MySQL数据库的数据导入导出过滤的方法。一、环境搭建安装MySQL数据库在开

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor