日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

概述

鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或純線程并發(fā)訪問(wèn)某一資源的機(jī)制,這些資源包括CPU、內(nèi)存、I/O等,而在數(shù)據(jù)庫(kù)中,數(shù)據(jù)也是一種供許多用戶(hù)(進(jìn)程/線程)共享的資源。如何保證數(shù)據(jù)并發(fā)訪問(wèn)的一致性、有效性是所在有數(shù)據(jù)庫(kù)必須解決的一個(gè)問(wèn)題,數(shù)據(jù)庫(kù)的鎖便是解決這個(gè)問(wèn)題的重要工具。數(shù)據(jù)庫(kù)的事務(wù)具有4個(gè)屬性,即ACID,其中C即是一致性,所以在數(shù)據(jù)庫(kù)中,鎖和事務(wù)總是息息相關(guān)的。

MySQL中的鎖

在MySQL中,不同的存儲(chǔ)引擎,可能支持的鎖會(huì)有所不同。下面的內(nèi)容主要圍繞使用比較多的InnoDB和MyISAM進(jìn)行描述。

MySQL中的鎖,從粒度即范圍劃分為3類(lèi):全局鎖、表級(jí)鎖、行級(jí)鎖。實(shí)際上,其它的如BDB存儲(chǔ)引擎還有頁(yè)級(jí)鎖,這里不做介紹。

  • 全局鎖

鎖住整個(gè)數(shù)據(jù)庫(kù)實(shí)例,使得整個(gè)庫(kù)處于只讀狀態(tài),會(huì)阻塞DML和DDL語(yǔ)句,由MySQL的SQL層實(shí)現(xiàn)。可以使用以下命令為數(shù)據(jù)庫(kù)加全局鎖(簡(jiǎn)稱(chēng)FTWRL)

FLUSH TABLES WITH READ LOCK;

釋放全局鎖命令如下

UNLOCK TABLES;

此外,在客戶(hù)端異常斷開(kāi)后,全局鎖會(huì)自動(dòng)釋放。全局鎖的典型使用場(chǎng)景是,做全庫(kù)邏輯備份(mysqldump)。

  • 表級(jí)鎖

針對(duì)當(dāng)前操作的整張表加鎖,實(shí)現(xiàn)簡(jiǎn)單,消耗資源較少,InnoDB和MyISAM均支持表級(jí)鎖。表級(jí)鎖分為表鎖和MySQL5.5版本引入的元數(shù)據(jù)鎖(MDL)兩種。MDL不需要顯式使用,在訪問(wèn)或操作一個(gè)表的時(shí)候會(huì)被自動(dòng)加上。當(dāng)對(duì)一個(gè)表做增刪改查操作的時(shí)候,加MDL讀鎖;當(dāng)要對(duì)表做結(jié)構(gòu)變更操作的時(shí)候,加MDL寫(xiě)鎖。 MDL可以避免讀寫(xiě)數(shù)據(jù)時(shí)突然變更了表結(jié)構(gòu)等元數(shù)據(jù)而導(dǎo)致出現(xiàn)問(wèn)題。

相關(guān)表級(jí)鎖的一些命令

-- 手動(dòng)增加表鎖(READ為共享讀鎖,WRITE為獨(dú)占寫(xiě)鎖)
LOCK TABLE 表名 READ | WRITE;
-- 查看表鎖情況
SHOW OPEN TABLES;
-- 刪除表鎖
UNLOCK TABLES;

表級(jí)鎖從資源管理角度又分為表共享讀鎖(共享鎖)和表獨(dú)占寫(xiě)鎖(排他鎖)兩種形式。如果對(duì)數(shù)據(jù)表加了共享讀鎖,當(dāng)前會(huì)話只能讀取加鎖的表數(shù)據(jù),同時(shí)不能增刪改(報(bào)錯(cuò)),也不能讀取其它表數(shù)據(jù);其它的會(huì)話則可以讀取加鎖的表數(shù)據(jù),增刪改將被阻塞,但可以操作其它表數(shù)據(jù)。

表共享讀鎖的演示

打開(kāi)一個(gè)客戶(hù)端會(huì)話1,對(duì)tdep表加共享讀鎖,會(huì)話1可以讀取tdep表的數(shù)據(jù),但不能進(jìn)行增刪改,同時(shí)也不能操作其它表。

MySQL進(jìn)階之MySQL中的鎖

會(huì)話1對(duì)tdep表加共享讀鎖的表現(xiàn)

此時(shí)打開(kāi)另外一個(gè)客戶(hù)端會(huì)話2,可以讀取tdep表數(shù)據(jù),對(duì)tdep表進(jìn)行增刪改將被阻塞,但可以操作其它數(shù)據(jù)表。

MySQL進(jìn)階之MySQL中的鎖

其它會(huì)話表現(xiàn)

表獨(dú)占寫(xiě)鎖演示

打開(kāi)一個(gè)客戶(hù)端會(huì)話1,對(duì)tdep表加獨(dú)占寫(xiě)鎖,會(huì)話1可以對(duì)tdep表進(jìn)行增刪改查,但依舊不可以操作其它表。

MySQL進(jìn)階之MySQL中的鎖

會(huì)話1對(duì)tdep表加獨(dú)占寫(xiě)鎖的表現(xiàn)

打開(kāi)另外一個(gè)客戶(hù)端會(huì)話2,會(huì)話可以操作其它數(shù)據(jù)表,但對(duì)tdep任何的操作包括select查詢(xún)都會(huì)被阻塞。

MySQL進(jìn)階之MySQL中的鎖

其它會(huì)話的表現(xiàn)

查看表級(jí)鎖定的爭(zhēng)用狀態(tài)

mysql> SHOW STATUS LIKE  'table_locks%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Table_locks_immediate | 99    |
| Table_locks_waited    | 0     |
+-----------------------+-------+

其中table_locks_immediate表示產(chǎn)生表級(jí)鎖定的次數(shù);table_locks_waited表示出現(xiàn)表級(jí)鎖定爭(zhēng)用而發(fā)生等待的次數(shù)。

  • 行級(jí)鎖

針對(duì)某行數(shù)據(jù)加鎖(也可能鎖定行之間的間隙),是一種排他鎖,防止其它事務(wù)修改此行。部分存儲(chǔ)引擎支持,比如InnoDB,下面主要講的就是InnoDB的行級(jí)鎖。

InnoDB行鎖是通過(guò)給索引上的索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)的,因此InnoDB這種行鎖實(shí)現(xiàn)特點(diǎn)意味著:只有通過(guò)
索引條件檢索的數(shù)據(jù),InnoDB才使用行級(jí)鎖,否則,InnoDB將使用表鎖(自動(dòng)使用表鎖,不需要人員干預(yù))!

InnoDB的行級(jí)鎖,按照鎖定范圍來(lái)說(shuō),分為三種:

記錄鎖(Record Locks),鎖定索引中一條記錄;間隙鎖(Gap Locks),要么鎖住索引記錄中間的值,要么鎖住第一個(gè)索引記錄前面的值或者最后一個(gè)索引記錄后面的值,其用于防止插入或更新間隙內(nèi)的數(shù)據(jù);Next-Key鎖,是索引記錄上的記錄鎖和在索引記錄之前的間隙鎖的組合。

按照功能來(lái)說(shuō),分為兩種:

共享鎖(S),允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖;排他鎖(X)允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫(xiě)鎖。

對(duì)于INSERT、UPDATE、DELETE語(yǔ)句,InnoDB會(huì)自動(dòng)給涉及數(shù)據(jù)集加排他鎖(X);對(duì)于普通SELECT語(yǔ)句,InnoDB不會(huì)加任何鎖,事務(wù)可以通過(guò)以下語(yǔ)句顯示給記錄集加共享鎖或排他鎖。

-- 使用LOCK IN SHARE MODE手動(dòng)添加共享鎖(S)
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;

-- 使用FOR UPDATE手動(dòng)添加排他鎖(x)
SELECT * FROM table_name WHERE condition FOR UPDATE;

使用COMMIT或ROLLBACK語(yǔ)句釋放鎖。

查看行級(jí)鎖爭(zhēng)用狀態(tài)

mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+

其中第2、3、5項(xiàng)是優(yōu)化或分析問(wèn)題的比較常用指標(biāo)

Innodb_row_lock_current_waits:當(dāng)前正在等待鎖定的數(shù)量;

Innodb_row_lock_time:從系統(tǒng)啟動(dòng)到現(xiàn)在鎖定總時(shí)間長(zhǎng)度;

Innodb_row_lock_time_avg:每次等待所花平均時(shí)間;

Innodb_row_lock_time_max:從系統(tǒng)啟動(dòng)到現(xiàn)在等待最常的一次所花的時(shí)間;

Innodb_row_lock_waits:系統(tǒng)啟動(dòng)后到現(xiàn)在總共等待的次數(shù);

行鎖基本演示

使用2個(gè)會(huì)話分別連接MySQL服務(wù)器,首先使用會(huì)話1更新tdep表中id為3的記錄,其中id為主鍵,有索引,所以會(huì)自動(dòng)為該記錄加上排他鎖(X),示例中關(guān)閉了自動(dòng)提交,以驗(yàn)證行鎖的效果。

MySQL進(jìn)階之MySQL中的鎖

會(huì)話1的表現(xiàn)

此時(shí)會(huì)話2可以更新其它記錄,也可以讀取id為3的記錄,但更新id為3的記錄將被阻塞

MySQL進(jìn)階之MySQL中的鎖

其它會(huì)話的表現(xiàn)

行讀鎖(共享鎖)演示

使用會(huì)話1為tdep表中id為3的記錄加上共享鎖,基本上可以做任何的操作

MySQL進(jìn)階之MySQL中的鎖

會(huì)話1加行讀鎖的表現(xiàn)

會(huì)話2可以訪問(wèn)其它表的數(shù)據(jù)以及未鎖定的其它行,id為3的行可以讀取但不能更新

MySQL進(jìn)階之MySQL中的鎖

其它會(huì)話的表現(xiàn)

行寫(xiě)鎖(排他鎖)演示

會(huì)話1對(duì)tdep表中id為3的記錄加了排他鎖,基本上可以做任何的操作

MySQL進(jìn)階之MySQL中的鎖

會(huì)話1加行寫(xiě)鎖的表現(xiàn)

會(huì)話2可以訪問(wèn)tdep表,但不能該記錄進(jìn)行更新或刪除,同時(shí)也不能對(duì)該記錄進(jìn)行加共享鎖或排他鎖。

MySQL進(jìn)階之MySQL中的鎖

其它會(huì)話的表現(xiàn)

  • 表級(jí)鎖和行級(jí)鎖的比較

表級(jí)鎖:開(kāi)銷(xiāo)小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低;

行級(jí)鎖:開(kāi)銷(xiāo)大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高;

總結(jié)

關(guān)于InnoDB的行級(jí)鎖,這里主要介紹了記錄鎖。InnoDB行級(jí)鎖是通過(guò)給索引實(shí)現(xiàn)的,只有通過(guò)索引條件檢索的數(shù)據(jù),InnoDB才使用行級(jí)鎖,否則,InnoDB將自動(dòng)使用表鎖。

對(duì)于INSERT、UPDATE、DELETE語(yǔ)句,InnoDB會(huì)自動(dòng)給涉及數(shù)據(jù)記錄加排他鎖(X),這意味著其它會(huì)話不能再對(duì)這些記錄進(jìn)行INSERT、UPDATE、DELETE操作以及使用LOCK IN SHARE MODE或FOR UPDATE對(duì)涉及的數(shù)據(jù)記錄進(jìn)行加讀鎖或?qū)戞i,非要操作將被阻塞;

對(duì)于普通SELECT語(yǔ)句,InnoDB不會(huì)加任何鎖,但可以通過(guò)LOCK IN SHARE MODE或FOR UPDATE語(yǔ)句顯示給記錄集加共享鎖或排他鎖。

一條記錄被加了排他鎖之后,其它會(huì)話不能再對(duì)該記錄加鎖,包括共享鎖和排他鎖。但如果一條記錄加的是共享鎖,則其它會(huì)話可以對(duì)該記錄加共享鎖,但不能加排他鎖。即一條記錄可以同時(shí)被多個(gè)會(huì)話加共享鎖,但只能被一個(gè)會(huì)話加排他鎖。

不同于表的獨(dú)占寫(xiě)鎖,行的排他鎖可以允許其它會(huì)話讀取行記錄,而表的獨(dú)占寫(xiě)鎖則不允許其它會(huì)話讀取表中的記錄。即行級(jí)鎖作用是限制了其它會(huì)話對(duì)加鎖的記錄進(jìn)行增刪改,但不限制讀取。

分享到:
標(biāo)簽:MySQL
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定