標籤:nod tom 研究 htm 屬性 參考 串列 環境 控制
參考 http://www.jb51.net/article/50047.htm 《MySQL行級鎖、表級鎖、頁級鎖詳細介紹》
頁級:引擎 BDB。
表級:引擎 MyISAM , 理解為鎖住整個表,可以同時讀,寫不行
行級:引擎 INNODB , 單獨的一行記錄加鎖 (更詳細的行鎖、表鎖,可以參考:http://www.cnblogs.com/charlesblc/p/5935326.html)
表級,直接鎖定整張表,在你鎖定期間,其它進程無法對該表進行寫操作。如果你是寫鎖,則其它進程則讀也不允許
行級,,僅對指定的記錄進行加鎖,這樣其它進程還是可以對同一個表中的其它記錄進行操作。
頁級,表級鎖速度快,但衝突多,行級衝突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。
上述三種鎖的特性可大致歸納如下:
1) 表級鎖:開銷小,加鎖快;不會出現死結;鎖定粒度大,發生鎖衝突的機率最高,並發度最低。
2) 行級鎖:開銷大,加鎖慢;會出現死結;鎖定粒度最小,發生鎖衝突的機率最低,並發度也最高。
3) 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死結;鎖定粒度界於表鎖和行鎖之間,並發度一般。
加表鎖的方式:
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;
MySQL表級鎖有兩種模式:表共用讀鎖(Table Read Lock)和表獨佔寫鎖(Table Write Lock)。
當一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,此時MySQL將會如優先處理進程呢?通過研究表明,寫進程將先獲得鎖(即使讀請求先到鎖等待隊列)。但這也造成一個很大的缺陷,即大量的寫操作會造成查詢操作很難獲得讀鎖,從而可能造成永遠阻塞。其機制是通過控制一個系統變數(concurrent_insert)來改變,更詳細的見原文。
MyISAM表的讀和寫是串列的,即在進行讀操作時不能進行寫操作,反之也是一樣。但在一定條件下MyISAM表也支援查詢和插入的操作的並發進行,其機制是通過控制一個系統變數(concurrent_insert)來進行的。(更詳細的見原文)
InnoDB鎖與MyISAM鎖的最大不同在於:一是支援事務(TRANCSACTION),二是採用了行級鎖。我們知道事務是由一組SQL語句組成的邏輯處理單元,其有四個屬性(簡稱ACID屬性),分別為:
原子性(Atomicity):事務是一個原子操作單元,其對資料的修改,要麼全部執行,要麼全都不執行;
一致性(Consistent):在事務開始和完成時,資料都必須保持一致狀態;
隔離性(Isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部並行作業影響的“獨立”環境執行;
持久性(Durable):事務完成之後,它對於資料的修改是永久性的,即使出現系統故障也能夠保持。
InnoDB有兩種模式的行鎖:
1)共用鎖定:允許一個事務去讀一行,阻止其他事務獲得相同資料集的獨佔鎖定。
( Select * from table_name where ......lock in share mode)
2)獨佔鎖定:允許獲得獨佔鎖定的事務更新資料,阻止其他事務取得相同資料集的共用讀鎖和 排他寫鎖。
(select * from table_name where.....for update)
Mysql表鎖、行鎖、頁鎖