共計 2281 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 MySQL 中怎么鎖定數(shù)據(jù)表,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
鎖定表的方法
防止客戶機的請求互相干擾或者服務器與維護程序相互干擾的方法主要有多種。如果你關閉數(shù)據(jù)庫,就可以保證服務器和 myisamchk 和 isamchk 之間沒有交互作用。但是停止服務器的運行并不是一個好注意,因為這樣做會使得沒有故障的數(shù)據(jù)庫和表也不可用。本節(jié)主要討論的過程,是避免服務器和 myisamchk 或 isamchk 之間的交互作用。實現(xiàn)這種功能的方法是對表進行鎖定。
服務器由兩種表的鎖定方法:
1. 內部鎖定
內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的 SELECT 查詢被另一個客戶機的 UPDATE 查詢所干擾。也可以利用內部鎖定機制防止服務器在利用 myisamchk 或 isamchk 檢查或修復表時對表的訪問。
語法:
鎖定表:LOCK TABLES tbl_name {READ | WRITE},[tbl_name {READ | WRITE},…]
解鎖表:UNLOCK TABLES
LOCK TABLES 為當前線程鎖定表。UNLOCK TABLES 釋放被當前線程持有的任何鎖。當線程發(fā)出另外一個 LOCK TABLES 時,或當服務器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。
如果一個線程獲得在一個表上的一個 READ 鎖,該線程 (和所有其他線程) 只能從表中讀。如果一個線程獲得一個表上的一個 WRITE 鎖,那么只有持鎖的線程 READ 或 WRITE 表,其他線程被阻止。
每個線程等待 (沒有超時) 直到它獲得它請求的所有鎖。
WRITE 鎖通常比 READ 鎖有更高的優(yōu)先級,以確保更改盡快被處理。這意味著,如果一個線程獲得 READ 鎖,并且然后另外一個線程請求一個 WRITE 鎖, 隨后的 READ 鎖請求將等待直到 WRITE 線程得到了鎖并且釋放了它。
顯然對于檢查,你只需要獲得讀鎖。再者鐘情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對于修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。
2. 外部鎖定
服務器還可以使用外部鎖定(文件級鎖)來防止其它程序在服務器使用表時修改文件。通常,在表的檢查操作中服務器將外部鎖定與 myisamchk 或 isamchk 作合使用。但是,外部鎖定在某些系統(tǒng)中是禁用的,因為他不能可靠的進行工作。對運行 myisamchk 或 isamchk 所選擇的過程取決于服務器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協(xié)議。
如果服務器用 –skip-locking 選項運行,則外部鎖定禁用。該選項在某些系統(tǒng)中是缺省的,如。可以通過運行 admin variables 命令確定服務器是否能夠使用外部鎖定。檢查 skip_locking 變量的值并按以下方法進行:
◆ 如果 skip_locking 為 off,則外部鎖定有效您可以繼續(xù)并運行人和一個實用程序來檢查表。服務器和實用程序將合作對表進行訪問。但是,運行任何一個實用程序之前,應該使用 mysqladmin flush-tables。為了修復表,應該使用表的修復鎖定協(xié)議。
◆ 如果 skip_locaking 為 on,則禁用外部鎖定,所以在 myisamchk 或 isamchk 檢查修復表示服務器并不知道,最好關閉服務器。如果堅持是服務器保持開啟狀態(tài),月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協(xié)議告訴服務器是該表不被其他客戶機訪問。
檢查表的鎖定協(xié)議
本節(jié)只介紹如果使用表的內部鎖定。對于檢查表的鎖定協(xié)議,此過程只針對表的檢查,不針對表的修復。
1. 調用 mysql 發(fā)布下列語句:
$mysql –u root –p db_namemysql LOCK TABLE tbl_name READ;mysql FLUSH TABLES;
該鎖防止其它客戶機在檢查時寫入該表和修改該表。FLUSH 語句導致服務器關閉表的文件,它將刷新仍在告訴緩存中的任何為寫入的改變。
2. 執(zhí)行檢查過程
$myisamchk tbl_name$ isamchk tbl_name
3. 釋放表鎖
mysql UNLOCK TABLES;
如果 myisamchk 或 isamchk 指出發(fā)現(xiàn)該表的問題,將需要執(zhí)行表的修復。
修復表的鎖定協(xié)議
這里只介紹如果使用表的內部鎖定。修復表的鎖定過程類似于檢查表的鎖定過程,但有兩個區(qū)別。第一,你必須得到寫鎖而非讀鎖。由于你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執(zhí)行修復之后發(fā)布 FLUSH TABLE 語句,因為 myisamchk 和 isamchk 建立的新的索引文件,除非再次刷新改表的高速緩存,否則服務器不會注意到這個改變。本例同樣適合優(yōu)化表的過程。
1. 調用 mysql 發(fā)布下列語句:
$mysql –u root –p db_namemysql LOCK TABLE tbl_name WRITE;mysql FLUSH TABLES;
2. 做數(shù)據(jù)表的拷貝,然后運行 myisamchk 和 isamchk:
$cp tbl_name.* /some/other/dir$myisamchk –recover tbl_name$ isamchk –recover tbl_name
–recover 選項只是針對安裝而設置的。這些特殊選項的選擇將取決與你執(zhí)行修復的類型。
3. 再次刷新高速緩存,并釋放表鎖:
mysql FLUSH TABLES;mysql UNLOCK TABLES;
關于 MySQL 中怎么鎖定數(shù)據(jù)表就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。