首頁 資料庫 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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資料庫技能培養到什麼程度能夠成功就業? Sep 12, 2023 pm 06:42 PM

MySQL資料庫技能培養到什麼程度能夠成功就業?隨著資訊化時代的快速發展,資料庫管理系統成為各行各業不可或缺的重要組成部分。而MySQL作為一種常用的關係型資料庫管理系統,具有廣泛的應用領域和就業機會。那麼,MySQL資料庫技能需要培養到什麼程度,才能夠成功就業呢?首先,掌握MySQL的基本原理和基礎知識是最基本的要求。 MySQL是一款開源的關聯式資料庫管理

如何使用MySQL資料庫進行時間序列分析? 如何使用MySQL資料庫進行時間序列分析? Jul 12, 2023 am 08:39 AM

如何使用MySQL資料庫進行時間序列分析?時間序列資料是指依照時間順序排列的資料集合,它具有時間上的連續性和相關性。時間序列分析是一種重要的資料分析方法,可用於預測未來趨勢、發現週期性變化、檢測異常值等。在本文中,我們將介紹如何使用MySQL資料庫進行時間序列分析,並附上程式碼範例。建立資料表首先,我們需要建立一個資料表來儲存時間序列資料。假設我們要分析的數

如何使用MySQL資料庫進行影像處理? 如何使用MySQL資料庫進行影像處理? Jul 14, 2023 pm 12:21 PM

如何使用MySQL資料庫進行影像處理? MySQL是一種強大的關聯式資料庫管理系統,除了用於儲存和管理資料之外,它還可以用於映像處理。本文將介紹如何使用MySQL資料庫進行影像處理,並提供一些程式碼範例。在開始之前,請確保已經安裝了MySQL資料庫,並且已經熟悉了基本的SQL語句。建立資料庫表格首先,建立一個新的資料庫表格,用於儲存影像資料。表格的結構可以如下所

使用Go語言進行MySQL資料庫的資料增量備份的方法 使用Go語言進行MySQL資料庫的資料增量備份的方法 Jun 17, 2023 pm 02:28 PM

隨著資料量的增加,資料庫的備份變得越來越重要。而對於MySQL資料庫,我們可以藉助Go語言實現自動化的增量備份。本篇文章將簡單介紹如何使用Go語言進行MySQL資料庫的資料增量備份。一、安裝Go語言環境首先,我們需要在本地安裝Go語言環境。可前往官網下載對應的安裝包並進行安裝。二、安裝對應的函式庫Go語言提供了許多存取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資料庫的快取。快取的概念在網路應用程式中,快取是為了加快資料的存取速度而創建的一種中間層。它主要用於存儲經常被請求的數據,以

See all articles