成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入探討MySQL鎖機制

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

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

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

 

 

 

【編輯推薦】

單表多字段MySQL模糊查詢的實現

帶您深入了解MySQL索引類型

MySQL外鍵和參照完整性的關系

MySQL定義外鍵的方法

詳解MySQL數據表類型

 

責任編輯:段燃 來源: 互聯網
相關推薦

2009-12-10 15:02:07

OSPF動態路由協議

2010-03-01 17:57:11

WCF緩存機制

2009-12-23 16:13:00

WPF Attache

2010-03-15 16:31:34

Java多線程

2010-07-21 09:38:15

PHP緩存技術

2009-11-20 17:17:08

Oracle函數索引

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

數據庫多云

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

扁平化扁平化設計

2012-02-28 14:43:43

2009-10-16 09:17:39

屏蔽布線系統

2009-12-14 14:40:10

Ruby全局域變量

2009-12-07 16:07:03

PHP類的繼承
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷在线免费 | 无吗视频 | av福利网站 | 国产精品一区在线 | 中文字幕综合 | 精品一区av| 性高湖久久久久久久久aaaaa | 久久在线| 嫩草视频网站 | 久久久久久亚洲国产精品 | www日日日| 亚洲成人自拍 | 天堂素人约啪 | 亚洲成人免费视频在线 | 国产精品自产拍 | 国产精品久久久久久久久久 | 成人久久18免费网站图片 | 国产高清在线观看 | 91视频进入| 国产精品毛片一区二区在线看 | 亚洲一区欧美 | 成人一区二区三区视频 | 国产一区二区三区久久久久久久久 | 国产免国产免费 | 成人网av| 久久精品国产99国产精品亚洲 | 欧美一区二区三区国产精品 | 国产一区二区在线视频 | 91精品国产综合久久久久久丝袜 | 欧美一级做性受免费大片免费 | 久久天天躁狠狠躁夜夜躁2014 | 99精品免费视频 | 国产99久久精品 | 91高清免费观看 | 午夜激情视频在线 | 国产午夜精品视频 | 手机av在线 | 亚洲资源在线 | 日本亚洲一区 | 91免费版在线观看 | 免费在线观看一区二区 |