偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

當(dāng)前MySQL已經(jīng)支持 ISAM, MyISAM, MEMORY (HEAP) 類型表的表級鎖了,BDB 表支持頁級鎖,InnoDB 表支持行級鎖。
很多時候,可以通過經(jīng)驗來猜測什么樣的鎖對應(yīng)用程序更合適,不過通常很難說一個鎖比別的更好,這全都要依據(jù)應(yīng)用程序來決定,不同的地方可能需要不同的鎖。
想要決定是否需要采用一個支持行級鎖的存儲引擎,就要看看應(yīng)用程序都要做什么,其中的查詢、更新語句是怎么用的。例如,很多的web應(yīng)用程序大量的做查詢,很少刪除,主要是基于索引的更新,只往特定的表中插入記錄。采用基本的MySQL MyISAM 表就很合適了。
MySQL中對表級鎖的存儲引擎來說是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請求鎖,并且按照請求的順序鎖表。
MySQL中用于 WRITE(寫)的表鎖的實現(xiàn)機(jī)制如下:
如果表沒有加鎖,那么就加一個寫鎖。
否則的話,將請求放到寫鎖隊列中。
MySQL中用于 READ(讀)的表鎖的實現(xiàn)機(jī)制如下:
如果表沒有加寫鎖,那么就加一個讀鎖。
否則的話,將請求放到讀鎖隊列中。
當(dāng)鎖釋放后,寫鎖隊列中的線程可以用這個鎖資源,然后才輪到讀鎖隊列中的線程。
這就是說,如果表里有很多更新操作的話,那么 Select 必須等到所有的更新都完成了之后才能開始。
從 MySQL 3.23.33 開始,可以通過狀態(tài)變量 Table_locks_waited 和 Table_locks_immediate 來分析系統(tǒ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 操作,就可以無需使用鎖表自由地并行執(zhí)行 Insert 和 Select 語句。也就是說,可以在其它客戶端正在讀取 MyISAM 表記錄的同時時插入新記錄。如果數(shù)據(jù)文件的中間沒有空余的磁盤塊的話,就不會發(fā)生沖突了,因為這種情況下所有的新記錄都會寫在數(shù)據(jù)文件的末尾(當(dāng)在表的中間做刪除或者更新操作時,就可能導(dǎo)致空洞)。當(dāng)空洞被新數(shù)據(jù)填充后,并行插入特性就會自動重新被啟用了。
如果想要在一個表上做大量的 Insert 和 Select 操作,但是并行的插入?yún)s不可能時,可以將記錄插入到臨時表中,然后定期將臨時表中的數(shù)據(jù)更新到實際的表里??梢杂靡韵旅顚崿F(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 使用行級鎖,BDB 使用頁級鎖。對于 InnoDB 和 BDB 存儲引擎來說,是可能產(chǎn)生死鎖的。這是因為 InnoDB 會自動捕獲行鎖,BDB 會在執(zhí)行 SQL 語句時捕獲頁鎖的,而不是在事務(wù)的開始就這么做。
行級鎖的優(yōu)點(diǎn)有:
在很多線程請求不同記錄時減少沖突鎖。
事務(wù)回滾時減少改變數(shù)據(jù)。
使長時間對單獨(dú)的一行記錄加鎖成為可能。
行級鎖的缺點(diǎn)有:
比頁級鎖和表級鎖消耗更多的內(nèi)存。
當(dāng)在大量表中使用時,比頁級鎖和表級鎖更慢,因為他需要請求更多的所資源。
當(dāng)需要頻繁對大部分?jǐn)?shù)據(jù)做 GROUP BY 操作或者需要頻繁掃描整個表時,就明顯的比其它鎖更糟糕。
使用更高層的鎖的話,就能更方便的支持各種不同的類型應(yīng)用程序,因為這種鎖的開銷比行級鎖小多了。
表級鎖在下列幾種情況下比頁級鎖和行級鎖更優(yōu)越:
很多操作都是讀表。
在嚴(yán)格條件的索引上讀取和更新,當(dāng)更新或者刪除可以用單獨(dú)的索引來讀取得到時:
Update tbl_name SET column=value Where unique_key_col=key_value;   
Delete FROM tbl_name Where unique_key_col=key_value;   
Select 和 Insert 語句并發(fā)的執(zhí)行,但是只有很少的 Update 和 Delete 語句。
很多的掃描表和對全表的 GROUP BY 操作,但是沒有任何寫表。
表級鎖和行級鎖或頁級鎖之間的不同之處還在于:
將同時有一個寫和多個讀的地方做版本(例如在MySQL中的并發(fā)插入)。也就是說,數(shù)據(jù)庫/表支持根據(jù)開始訪問數(shù)據(jù)時間點(diǎn)的不同支持各種不同的試圖。其它名有:時間行程,寫復(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ù)制在很多情況下比頁級鎖或行級鎖好多了。盡管如此,最壞情況時還是比其它正常鎖使用了更多的內(nèi)存。
可以用應(yīng)用程序級鎖來代替行級鎖,例如MySQL中的 GET_LOCK() 和 RELEASE_LOCK()。但它們是勸告鎖(原文:These are advisory locks),因此只能用于安全可信的應(yīng)用程序中。

 

 

 

【編輯推薦】

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

帶您深入了解MySQL索引類型

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

MySQL定義外鍵的方法

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

 

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

2009-12-10 15:02:07

OSPF動態(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-11-20 17:17:08

Oracle函數(shù)索引

2021-05-17 05:36:02

CSS 文字動畫技巧

2021-08-12 15:45:23

Pythonimport模塊

2009-12-07 19:06:20

PHP mysql_f

2010-03-05 13:44:00

Python序列

2009-08-27 11:27:58

foreach語句C# foreach語

2023-01-12 17:18:06

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

2011-02-25 09:23:00

Java類加載器

2015-09-02 08:57:56

JavaHashMap工作原理

2010-03-31 14:58:03

云計算

2013-07-11 09:45:48

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

2012-02-28 14:43:43

2009-10-16 09:17:39

屏蔽布線系統(tǒng)

2009-12-14 14:40:10

Ruby全局域變量

2009-12-07 16:07:03

PHP類的繼承
點(diǎn)贊
收藏

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