在很多客戶一起查詢資料表時,如果使客戶能最快地查詢到資料就是排程和鎖定做的工作了。在mysql中,我們把select操作叫做讀,把對資料表修改增加的操作(insert,update,replace...)叫做寫。mysql的基本排程策略可以歸納為以下兩條:
寫入請求將按它們到達伺服器的順序進行處理;
寫操作的優先順序要高於讀操作。
myisam和isam資料表的排程策略是在資料表鎖的幫助下實現的,在客戶程式要訪問資料表之前,需獲得相應的鎖,在完成對資料表的操作後,再釋放該鎖。鎖的管理通常由伺服器管理,也可人為地用lock tables和unlock tables命令來申請和釋放鎖。寫操作時,需要申請乙個獨占性的鎖,也就是說在寫操作其間,該錶只能由寫操作的客戶使用。讀操作時,客戶必須申請乙個允許其他客戶對資料表進行寫操作的鎖,以確保客戶在讀的過程中資料表不會發生改變。但讀操作鎖不是獨佔的,可有多個讀操作同時作用於同乙個資料表。
通過一些修飾符可影響排程策略,如low_priority(用於delete,insert,load data,replace,update語句)、high_priority(用於select語句)、delayed(用於insert和replace語句)。它們的作用是這樣的:
low_priority會使寫操作的優先順序降低到讀操作以下,也就是說讀操作會阻塞該級別的寫操作,select的high_priority有類似的作用。
insert語句中的delayed修飾會使插入操作被放入乙個「延遲插入」佇列。並返回狀態資訊給客戶,使客戶程式可在新資料行還沒插入到資料表之前繼續執行後面的操作。如果一直有客戶讀該資料表,新資料行會一直待在佇列中,直到資料表沒有讀操作時,伺服器才會把佇列中的資料行真正插入到資料表中。該語句可用在以下場合,在乙個有冗長查詢的資料表中插入資料,而你又不想被阻塞,你就可發出insert delayed語句,把插入操作放入伺服器「延遲插入」佇列,你無需等待就馬上可進行接下來的操作。
insert [low_priority | delayed] [ignore]
[into] tbl_name
set col_name=expression, col_name=expression, ...
當乙個資料表裡從未進行過刪除操作或剛剛對它進行過碎片整理的情況下,用insert語句插入的資料行只會被新增到資料表的末尾,而不會插入到資料表的中間位置。這樣,對於myisam表,mysql允許在有其它客戶正在讀操作的時間進行寫操作。我們稱之這併發插入。要使用該技巧,需注意以下兩個問題:
不要在insert語句中使用low_priority修飾符。
讀操作應用lock tables ... read local而不是用lock tables ...(本地讀鎖) read語句來進行資料表讀鎖定。local關鍵字只對資料表中已存在行進行鎖定,不會阻塞新行新增到資料表末尾。
bdb資料表使用頁面級操作鎖,innodb資料表使用資料行級操作鎖。所以這兩種表的併發性比myisam和isam資料表這種表級鎖的併發性會好很多。其中innodb的併發性最好。綜上所述,我們可得出以下結論:
myisam和isam資料表的檢索速度最快,但如果在檢索和修改操作較多的場合,會出鎖競爭的問題,造成等待時間延長。
bdb和innodb資料表能在有大量修改操作的環境下提供很好的併發性,從而提供更好的效能。
myisam和isam資料表由於進行表級鎖定,所以不會出現死鎖現象,bdb和innodb資料表則存在死鎖的可能性。
資料庫表 行 資料庫鎖定
1如何鎖乙個表的某一行 settransaction isolation level read uncommitted select from table rowlock where id 1 2鎖定資料庫的乙個表 select from table with holdlock 加鎖語句 sybas...
mysql資料庫鎖定機制
為了保證資料的一致完整性,任何乙個資料庫都存在鎖定機制。鎖定機制的優劣直接應想到乙個資料庫系統的併發處理能力和效能,所以鎖定機制的實現也就成為了各種資料庫的核心技術之一。下面將對 mysql 的 innodb 各自的鎖定機制進行較為詳細的分析。總的來說,mysql 各儲存引擎使用了三種型別 級別 的...
資料庫sa賬戶被鎖定
問題描述 佈署某一 後,主頁面不能登入,訪問同一伺服器上的另一 突然系統報18456錯誤,提示資訊是 無法連線到 伺服器 其他資訊為 使用者 sa 登入失敗。microsoft sql server,錯誤 18456 問題原因 佈署 時,資料庫連線檔案中的密碼不正確,所以多次訪問主頁面後就出現問題....