自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入探討MySQL鎖機(jī)制

數(shù)據(jù)庫(kù) MySQL
MySQL中的表鎖相信大家都不會(huì)陌生,下文對(duì)MySQL鎖機(jī)制進(jìn)行了深入的探討分析,如果您對(duì)此方面感興趣的話,不妨一看。

MySQL鎖機(jī)制究竟是怎樣的呢?這是很多人都提到過(guò)的問(wèn)題,下面就為您詳細(xì)介紹MySQL鎖機(jī)制方面的知識(shí),希望可以讓您MySQL鎖機(jī)制有更多的了解。

當(dāng)前MySQL已經(jīng)支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級(jí)鎖了,BDB 表支持頁(yè)級(jí)鎖,InnoDB 表支持行級(jí)鎖。
很多時(shí)候,可以通過(guò)經(jīng)驗(yàn)來(lái)猜測(cè)什么樣的鎖對(duì)應(yīng)用程序更合適,不過(guò)通常很難說(shuō)一個(gè)鎖比別的更好,這全都要依據(jù)應(yīng)用程序來(lái)決定,不同的地方可能需要不同的鎖。
想要決定是否需要采用一個(gè)支持行級(jí)鎖的存儲(chǔ)引擎,就要看看應(yīng)用程序都要做什么,其中的查詢、更新語(yǔ)句是怎么用的。例如,很多的web應(yīng)用程序大量的做查詢,很少刪除,主要是基于索引的更新,只往特定的表中插入記錄。采用基本的MySQL MyISAM 表就很合適了。
MySQL中對(duì)表級(jí)鎖的存儲(chǔ)引擎來(lái)說(shuō)是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請(qǐng)求鎖,并且按照請(qǐng)求的順序鎖表。
MySQL中用于 WRITE(寫)的表鎖的實(shí)現(xiàn)機(jī)制如下:
如果表沒有加鎖,那么就加一個(gè)寫鎖。
否則的話,將請(qǐng)求放到寫鎖隊(duì)列中。
MySQL中用于 READ(讀)的表鎖的實(shí)現(xiàn)機(jī)制如下:
如果表沒有加寫鎖,那么就加一個(gè)讀鎖。
否則的話,將請(qǐng)求放到讀鎖隊(duì)列中。
當(dāng)鎖釋放后,寫鎖隊(duì)列中的線程可以用這個(gè)鎖資源,然后才輪到讀鎖隊(duì)列中的線程。
這就是說(shuō),如果表里有很多更新操作的話,那么 Select 必須等到所有的更新都完成了之后才能開始。
從 MySQL 3.23.33 開始,可以通過(guò)狀態(tài)變量 Table_locks_waited 和 Table_locks_immediate 來(lái)分析系統(tǒng)中的鎖表爭(zhēng)奪情況:
mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
|Table_locks_immediate | 1151552 |
| Table_locks_waited    | 15324   |
+-----------------------+---------+

在 MySQL 3.23.7(在Windows上是3.23.25)以后,在 MyISAM 表中只要沒有沖突的 Insert 操作,就可以無(wú)需使用鎖表自由地并行執(zhí)行 Insert 和 Select 語(yǔ)句。也就是說(shuō),可以在其它客戶端正在讀取 MyISAM 表記錄的同時(shí)時(shí)插入新記錄。如果數(shù)據(jù)文件的中間沒有空余的磁盤塊的話,就不會(huì)發(fā)生沖突了,因?yàn)檫@種情況下所有的新記錄都會(huì)寫在數(shù)據(jù)文件的末尾(當(dāng)在表的中間做刪除或者更新操作時(shí),就可能導(dǎo)致空洞)。當(dāng)空洞被新數(shù)據(jù)填充后,并行插入特性就會(huì)自動(dòng)重新被啟用了。
如果想要在一個(gè)表上做大量的 Insert 和 Select 操作,但是并行的插入?yún)s不可能時(shí),可以將記錄插入到臨時(shí)表中,然后定期將臨時(shí)表中的數(shù)據(jù)更新到實(shí)際的表里。可以用以下命令實(shí)現(xiàn):
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> Insert INTO real_table Select * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB 使用行級(jí)鎖,BDB 使用頁(yè)級(jí)鎖。對(duì)于 InnoDB 和 BDB 存儲(chǔ)引擎來(lái)說(shuō),是可能產(chǎn)生死鎖的。這是因?yàn)?InnoDB 會(huì)自動(dòng)捕獲行鎖,BDB 會(huì)在執(zhí)行 SQL 語(yǔ)句時(shí)捕獲頁(yè)鎖的,而不是在事務(wù)的開始就這么做。
行級(jí)鎖的優(yōu)點(diǎn)有:
在很多線程請(qǐng)求不同記錄時(shí)減少?zèng)_突鎖。
事務(wù)回滾時(shí)減少改變數(shù)據(jù)。
使長(zhǎng)時(shí)間對(duì)單獨(dú)的一行記錄加鎖成為可能。
行級(jí)鎖的缺點(diǎn)有:
比頁(yè)級(jí)鎖和表級(jí)鎖消耗更多的內(nèi)存。
當(dāng)在大量表中使用時(shí),比頁(yè)級(jí)鎖和表級(jí)鎖更慢,因?yàn)樗枰?qǐng)求更多的所資源。
當(dāng)需要頻繁對(duì)大部分?jǐn)?shù)據(jù)做 GROUP BY 操作或者需要頻繁掃描整個(gè)表時(shí),就明顯的比其它鎖更糟糕。
使用更高層的鎖的話,就能更方便的支持各種不同的類型應(yīng)用程序,因?yàn)檫@種鎖的開銷比行級(jí)鎖小多了。
表級(jí)鎖在下列幾種情況下比頁(yè)級(jí)鎖和行級(jí)鎖更優(yōu)越:
很多操作都是讀表。
在嚴(yán)格條件的索引上讀取和更新,當(dāng)更新或者刪除可以用單獨(dú)的索引來(lái)讀取得到時(shí):
Update tbl_name SET column=value Where unique_key_col=key_value;   
Delete FROM tbl_name Where unique_key_col=key_value;   
Select 和 Insert 語(yǔ)句并發(fā)的執(zhí)行,但是只有很少的 Update 和 Delete 語(yǔ)句。
很多的掃描表和對(duì)全表的 GROUP BY 操作,但是沒有任何寫表。
表級(jí)鎖和行級(jí)鎖或頁(yè)級(jí)鎖之間的不同之處還在于:
將同時(shí)有一個(gè)寫和多個(gè)讀的地方做版本(例如在MySQL中的并發(fā)插入)。也就是說(shuō),數(shù)據(jù)庫(kù)/表支持根據(jù)開始訪問(wèn)數(shù)據(jù)時(shí)間點(diǎn)的不同支持各種不同的試圖。其它名有:時(shí)間行程,寫復(fù)制,或者是按需復(fù)制。
原文: Versioning (such as we use in MySQL for concurrent inserts) where you can have one writer at the same time as many readers. This means that the database/table supports different views for the data depending on when you started to access it. Other names for this are time travel, copy on write, or copy on demand.
按需復(fù)制在很多情況下比頁(yè)級(jí)鎖或行級(jí)鎖好多了。盡管如此,最壞情況時(shí)還是比其它正常鎖使用了更多的內(nèi)存。
可以用應(yīng)用程序級(jí)鎖來(lái)代替行級(jí)鎖,例如MySQL中的 GET_LOCK() 和 RELEASE_LOCK()。但它們是勸告鎖(原文:These are advisory locks),因此只能用于安全可信的應(yīng)用程序中。

 

 

 

【編輯推薦】

單表多字段MySQL模糊查詢的實(shí)現(xiàn)

帶您深入了解MySQL索引類型

MySQL外鍵和參照完整性的關(guān)系

MySQL定義外鍵的方法

詳解MySQL數(shù)據(jù)表類型

 

責(zé)任編輯:段燃 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-12-10 15:02:07

OSPF動(dòng)態(tài)路由協(xié)議

2010-03-01 17:57:11

WCF緩存機(jī)制

2009-12-23 16:13:00

WPF Attache

2010-03-15 16:31:34

Java多線程

2010-07-21 09:38:15

PHP緩存技術(shù)

2009-12-07 19:06:20

PHP mysql_f

2009-11-20 17:17:08

Oracle函數(shù)索引

2021-05-17 05:36:02

CSS 文字動(dòng)畫技巧

2021-08-12 15:45:23

Pythonimport模塊

2009-08-27 11:27:58

foreach語(yǔ)句C# foreach語(yǔ)

2010-03-05 13:44:00

Python序列

2011-02-25 09:23:00

Java類加載器

2010-03-31 14:58:03

云計(jì)算

2015-09-02 08:57:56

JavaHashMap工作原理

2023-01-12 17:18:06

數(shù)據(jù)庫(kù)多云

2024-01-26 06:42:05

Redis數(shù)據(jù)結(jié)構(gòu)

2017-01-03 17:57:46

Android異步精髓Handler

2013-07-11 09:45:48

扁平化扁平化設(shè)計(jì)

2009-10-16 09:17:39

屏蔽布線系統(tǒng)

2009-11-12 13:56:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)