日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
MySQL鎖機(jī)制你所不了解的一些事兒

1.MySQL中并發(fā)和隔離控制機(jī)制

創(chuàng)新互聯(lián)的客戶(hù)來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。專(zhuān)業(yè)領(lǐng)域包括成都做網(wǎng)站、網(wǎng)站建設(shè)、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā)。

Meta-data元數(shù)據(jù)鎖:在table cache緩存里實(shí)現(xiàn)的,為DDL(Data Definition Language)提供隔離操作。一種特別的meta-data元數(shù)據(jù)類(lèi)型,叫Name Lock。(SQL層)

表級(jí)table-level數(shù)據(jù)鎖(SQL層)

存儲(chǔ)引擎特有機(jī)制 -- row locks行鎖,page locks頁(yè)鎖,table locks表級(jí),versioning版本(在引擎中實(shí)現(xiàn))

全局讀鎖 -- FLUSH TABLES WITH READ LOCK(SQL層)

2.在語(yǔ)句執(zhí)行中表的生命周期

 DML(Data Manipulation Language)例子:

計(jì)算語(yǔ)句使用到的所有表

在每個(gè)表:打開(kāi)open表 -- 從table cache緩存里得到TABLE對(duì)象,并在此表加上meta-data元數(shù)據(jù)鎖

等待全局讀鎖后改變數(shù)據(jù)

在每個(gè)表:鎖lock表 -- 在表加上table-level數(shù)據(jù)鎖

執(zhí)行語(yǔ)句:調(diào)用:handler::write_row()/read_rnd()/read_index(),等;隱式地調(diào)用引擎級(jí)engine-level鎖機(jī)制

在每個(gè)表:釋放表的數(shù)據(jù)鎖

在每個(gè)表:釋放表的DDL鎖并把表放回table cache緩存里

 DDL語(yǔ)句也是一樣,沒(méi)有典型的執(zhí)行計(jì)劃。

 3.獲取meta-data元數(shù)據(jù)鎖

meta-data元數(shù)據(jù)鎖的實(shí)現(xiàn)作為T(mén)ABLE對(duì)象的一個(gè)屬性,TABLE對(duì)象代表了table cache緩存。

meta-data元數(shù)據(jù)鎖為如下任何一種:shared共享鎖 -- 隱式地加鎖,只通過(guò)標(biāo)記TABLE對(duì)象“被使用”;semi-exclusive半獨(dú)享鎖,也叫Name Lock,RENAME操作會(huì)在源表和目標(biāo)加上此鎖;exclusive獨(dú)享,也叫exclusive name lock,CREATE TABLE ... SELECT操作會(huì)在目標(biāo)表上加上此鎖,如果沒(méi)有的話。

 4.表高速緩存(table cache)

是一個(gè)HASH變量,叫open_cache

TABLE對(duì)象是HASH元素

以HASH的操作被LOCK_open mutex互斥量保護(hù)

內(nèi)部結(jié)構(gòu)(The table cache: internal structure)

在緩存里,每個(gè)物理表可能被多個(gè)TABLE實(shí)例表示

相同表的所有TABLE實(shí)例,通過(guò)相連的列(a linked list)連接著

每個(gè)TABLE實(shí)例有一個(gè)table cache緩存版本的復(fù)制 -- TABLE實(shí)例保存的版本不會(huì)和當(dāng)前table cache緩存版本一致,而是保存舊的和從緩存刪除的

被某些語(yǔ)句使用的TABLE實(shí)例被會(huì)標(biāo)記為對(duì)其它的語(yǔ)句來(lái)說(shuō)是無(wú)效的 -- 這就是meta-data元數(shù)據(jù)鎖的本質(zhì)

在緩存中的TABLE實(shí)例通常地有一個(gè)有效的句柄實(shí)例連接著它

內(nèi)部運(yùn)算(The table cache: operations)

主要的代碼在:sql/sql_base.cc,sql/lock.cc,sql/table.h,sql/sql_table.cc

主要的方法:open_table(),close_thread_tables(),close_cached_table(),lock_table_names()

事實(shí)上,一個(gè)概念/對(duì)象組合不僅用于緩存或鎖定:LOCK_open mutex互斥量也用到其它的操作,如:使磁盤(pán)上和處理中的表創(chuàng)建的原子性

典型的操作,來(lái)自隔離等級(jí)Pov的重要(注:isolation PoV沒(méi)研究出是什么意思):語(yǔ)句查詢(xún)時(shí),打開(kāi)和關(guān)閉表 -- shared共享鎖;強(qiáng)制和等待直到表的所有實(shí)例被關(guān)閉 --  exclusive獨(dú)享(但不完全);Name Lock -- 特殊地情況,當(dāng)手上沒(méi)有TABLE實(shí)例,只能使用一個(gè)特殊的占位符(甚至表可能不存在)。

鎖多表(The table cache: locking multiple tables)

使用一種嘗試和回退(try and back-off)的技術(shù)來(lái)避免死鎖(樂(lè)觀鎖)

為了DDL操作的一套訣竅,如使鎖升級(jí)或者防止DDL失效

 LOCK_open問(wèn)題

 Lock_open互斥量:

保護(hù)table cache緩存內(nèi)的結(jié)構(gòu)

分組存儲(chǔ)引擎內(nèi)的表和對(duì)象的.frm文件的創(chuàng)建,也為RENAME操作提供原子性操作

在每個(gè)語(yǔ)句訪問(wèn)表時(shí)會(huì)使用它兩次:在open_tables()和close_thread_tables()

在使用DDL操作時(shí),磁盤(pán)讀寫(xiě)和甚至同步(sync)都會(huì)使用它

5.ALTER TABLE例子

ALTER TABLE執(zhí)行的簡(jiǎn)化計(jì)劃:

以TL_WRITE_ALLOW_READ的打開(kāi)和加鎖表

創(chuàng)建一個(gè)以臨時(shí)名字的被ALTER的復(fù)制表

強(qiáng)制并等待直到表的所有實(shí)例都關(guān)閉(鎖升級(jí))

交換新和舊的版本

刪除舊的版本

 這是一個(gè)常規(guī)的情況,還有一些被優(yōu)化的情況。

 ALTER TABLE執(zhí)行的調(diào)試:

 
 
 
  1. T@8: | query: alter table t1 add column k int  
  2. T@8: | >mysql_parse  
  3. T@8: | | >mysql_execute_command  
  4. T@8: | | | >mysql_alter_table  
  5. T@8: | | | | >open_ltable  
  6. T@8: | | | | | >open_table  
  7. T@8: | | | | | 
  8. T@8: | | | | | >mysql_lock_tables  
  9. T@8: | | | | | | >get_lock_data  
  10. T@8: | | | | | | | >ha_innobase::store_lock  
  11. T@8: | | | | | | | 
  12. T@8: | | | | | | 
  13. T@8: | | | | | | >lock_external  
  14. T@8: | | | | | | | >ha_innobase::external_lock  
  15. T@8: | | | | | | | | enter: lock_type: 1  
  16. T@8: | | | | | | | | >trans_register_ha  
  17. T@8: | | | | | | | | | enter: stmt  
  18. T@8: | | | | | | | | 
  19. T@8: | | | | | | | 
  20. T@8: | | | | | | 
  21. T@8: | | | | | | >thr_multi_lock  
  22. T@8: | | | | | | | >thr_lock  
  23. T@8: | | | | | | | 
  24. T@8: | | | | | | 
  25. T@8: | | | | | 
  26. T@8: | | | | 
  27. T@8: | | | | >mysql_create_table  
  28. T@8: | | | | 
  29. T@8: | | | | >open_temporary_table  
  30. T@8: | | | | | >openfrm  
  31. T@8: | | | | | | >handler::ha_open  
  32. T@8: | | | | | | | enter: name: ./test/#sql-3081_1 db_type: 12 db_stat: 7 mode: 2 lock_test: 2  
  33. T@8: | | | | | | | >ha_innobase::open  
  34. T@8: | | | | | | | 
  35. T@8: | | | | | | 
  36. T@8: | | | | | 
  37. T@8: | | | | 
  38. T@8: | | | | >copy_data_between_tables  
  39. T@8: | | | | 
  40. T@8: | | | | >closefrm  
  41. T@8: | | | | 
  42. T@8: | | | | >close_cached_table  
  43. T@8: | | | | | enter: table: t1  
  44. T@8: | | | | | >wait_while_table_is_used  
  45. T@8: | | | | | | >get_lock_data  
  46. T@8: | | | | | | 
  47. T@8: | | | | | | >thr_abort_locks  
  48. T@8: | | | | | | 
  49. T@8: | | | | | | >remove_table_from_cache  
  50. T@8: | | | | | | | enter: Table: 'test.t1' flags: 2  
  51. T@8: | | | | | | 
  52. T@8: | | | | | 
  53. T@8: | | | | | >mysql_unlock_tables  
  54. T@8: | | | | | | >thr_multi_unlock  
  55. T@8: | | | | | | | lock: data: 0x8b7f9b0 count: 1  
  56. T@8: | | | | | | | >thr_unlock  
  57. T@8: | | | | | | | 
  58. T@8: | | | | | | 
  59. T@8: | | | | | | >unlock_external  
  60. T@8: | | | | | | | >ha_innobase::external_lock  
  61. T@8: | | | | | | | 
  62. T@8: | | | | | | 
  63. T@8: | | | | | 
  64. T@8: | | | | | >unlink_open_table  
  65. T@8: | | | | | | >hash_delete  
  66. T@8: | | | | | | | >free_cache_entry  
  67. T@8: | | | | | | | | >closefrm  
  68. T@8: | | | | | | | | | >ha_innobase::close  
  69. T@8: | | | | | | | | | 
  70. T@8: | | | | | | | | 
  71. T@8: | | | | | | | 
  72. T@8: | | | | | | 
  73. T@8: | | | | | 
  74. T@8: | | | | 
  75. T@8: | | | | >mysql_rename_table  
  76. T@8: | | | | | >ha_innobase::rename_table  
  77. T@8: | | | | | 
  78. T@8: | | | | 
  79. T@8: | | | | >mysql_rename_table  
  80. T@8: | | | | | >ha_innobase::rename_table  
  81. T@8: | | | | | 
  82. T@8: | | | | 
  83. T@8: | | | | >my_delete  
  84. T@8: | | | | | my: name ./test/#sql2-3081-1.frm MyFlags 0  
  85. T@8: | | | | 
  86. T@8: | | | | >ha_delete_table  
  87. T@8: | | | | | >ha_innobase::delete_table  
  88. T@8: | | | | | 
  89. T@8: | | | | 
  90. T@8: | | | | >ha_commit_trans 
  91. T@8: | | | | 
  92. T@8: | | | | >ha_commit_trans 
  93. T@8: | | | | 
  94. T@8: | | | 
  95. T@8: | | 
  96. T@8: | 
  97. T@8: 

 6.RENAME TABLE例子

得到源表和目的表的name-lock鎖:在table cache緩存內(nèi)插入特殊的TABLE實(shí)例的占位符并等待直到這些表的所有實(shí)例都關(guān)閉

重命名這些表的.frm文件和調(diào)用handler::rename_table()方法

刪除name-lock鎖

 在整個(gè)解析過(guò)程中,都使用LOCK_open

 
 
 
  1. T@10: | query: rename table t1 to t2  
  2. T@10: | >mysql_parse  
  3. T@10: | | >mysql_execute_command  
  4. T@10: | | | >mysql_rename_tables  
  5. T@10: | | | | >lock_table_names  
  6. T@10: | | | | | >lock_table_name  
  7. T@10: | | | | | | enter: db: test name: t1  
  8. T@10: | | | | | 
  9. T@10: | | | | | >remove_table_from_cache  
  10. T@10: | | | | | | enter: Table: 'test.t1' flags: 0  
  11. T@10: | | | | | | >hash_delete  
  12. T@10: | | | | | | | >free_cache_entry  
  13. T@10: | | | | | | | | >closefrm  
  14. T@10: | | | | | | | | | >ha_innobase::close  
  15. T@10: | | | | | | | | | 
  16. T@10: | | | | | | | | 
  17. T@10: | | | | | | | 
  18. T@10: | | | | | | 
  19. T@10: | | | | | 
  20. T@10: | | | | | >lock_table_name  
  21. T@10: | | | | | | enter: db: test name: t2  
  22. T@10: | | | | | 
  23. T@10: | | | | | >remove_table_from_cache  
  24. T@10: | | | | | | enter: Table: 'test.t2' flags: 0  
  25. T@10: | | | | | 
  26. T@10: | | | | 
  27. T@10: | | | | >rename_tables  
  28. T@10: | | | | | >do_rename  
  29. T@10: | | | | | | >mysql_rename_table  
  30. T@10: | | | | | | | >ha_innobase::rename_table  
  31. T@10: | | | | | | | 
  32. T@10: | | | | | | | >my_rename  
  33. T@10: | | | | | | | | my: from ./test/t1.frm to ./test/t2.frm MyFlags 16  
  34. T@10: | | | | | | | 
  35. T@10: | | | | | | 
  36. T@10: | | | | | 
  37. T@10: | | | | 
  38. T@10: | | | | >unlock_table_names  
  39. T@10: | | | | | >unlock_table_name  
  40. T@10: | | | | | | >hash_delete  
  41. T@10: | | | | | | | >free_cache_entry  
  42. T@10: | | | | | | | 
  43. T@10: | | | | | | 
  44. T@10: | | | | | 
  45. T@10: | | | | | >unlock_table_name  
  46. T@10: | | | | | | >hash_delete  
  47. T@10: | | | | | | | >free_cache_entry  
  48. T@10: | | | | | | | 
  49. T@10: | | | | | | 
  50. T@10: | | | | | 
  51. T@10: | | | | 
  52. T@10: | | | 
  53. T@10: | | 
  54. T@10: | 

7.表級(jí)table-level鎖

主要源代碼見(jiàn):sql/lock.cc,mysys/thr_lock.cc。mysql_lock/unlock_tables()(SQL層操作)和thr_multi_lock()/thr_lock()(鎖兼容邏輯lock-compatibility logic)

表是以打開(kāi)著被加鎖的。被加鎖的對(duì)象被句柄關(guān)聯(lián)著;存儲(chǔ)引擎會(huì)調(diào)整鎖的類(lèi)型。如innodb/bdb,事實(shí)上大量的對(duì)象被加鎖的,如merge/partition,見(jiàn)handler::store_lock()方法。

使用鎖等級(jí)避免死鎖。所有表一次性加鎖;如果存儲(chǔ)引擎調(diào)整鎖造成死鎖,由存儲(chǔ)引擎負(fù)責(zé)

在一些情況下,表會(huì)更早地被解鎖

8 .預(yù)加鎖(pre-locking)

歷史上避免死鎖方案用于表級(jí)table-level數(shù)據(jù)鎖,是要求一次性加鎖一個(gè)語(yǔ)句內(nèi)的所有表

因此,對(duì)語(yǔ)句使用的函數(shù)/觸發(fā),我們不得不打開(kāi)所有直接地或間接地用到的表,且對(duì)它們加鎖。為這個(gè),我們建立一個(gè)被使用表的可傳送閉包

為了有效實(shí)現(xiàn),我們混合層次和訪問(wèn)(layers and access)成某些解析/語(yǔ)句上下文(parser/statement context),這些上下文來(lái)自主要處理表的模板

9.全局讀鎖(global read lock)

實(shí)現(xiàn)為FLUSH TABLES WITH READ LOCK,用來(lái)備份

從執(zhí)行上防止DDL和DML

勸告:每個(gè)DDL/DML語(yǔ)句檢查是否有一個(gè)正掛著的全局讀鎖和停止是否有任何一個(gè)。通過(guò)直接調(diào)用wait_if_global_read_lock()(在這個(gè)情況我們會(huì)設(shè)置來(lái)自全局讀鎖的保護(hù),且只有調(diào)用start_waiting_global_read_lock()來(lái)消除這個(gè)保護(hù),通常在這情況下沒(méi)有打開(kāi)的表);或者通過(guò)mysql_lock_tables()(在后一種情況下,我們還重新打開(kāi)表)

線程操作FLUSH TABLES WITH READ LOCK來(lái)設(shè)置一個(gè)全局讀鎖的標(biāo)識(shí),初始一個(gè)FLUSH TABLES語(yǔ)句。然后等待直到所有的表都清空(flush)

原文標(biāo)題:MySQL 鎖機(jī)制概述

鏈接:http://www.cnblogs.com/popgo/archive/2010/07/26/1778803.html

【編輯推薦】

  1. MySQL數(shù)據(jù)庫(kù)鎖機(jī)制的原理淺析
  2. MySQL鎖定機(jī)制的原理
  3. 使用調(diào)度和鎖定進(jìn)行MySQL查詢(xún)優(yōu)化
  4. MySQL數(shù)據(jù)庫(kù)表里如何進(jìn)行鎖定?
  5. MySQL表級(jí)鎖,行級(jí)鎖,頁(yè)級(jí)鎖各顯神通

新聞標(biāo)題:MySQL鎖機(jī)制你所不了解的一些事兒
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/cdgdjjd.html