2007-12-14, 03:37 PM
|
#1
|
管理員
|
03. 資料表的鎖定(Locking)
資料表的鎖定(Locking)
Lock可分為隱性與顯性二種:www-slime-com-tw
- 隱性的Lock是由Server自動取得,例如當client執行SELECT操作時Server便會自動取得該table的READ LOCK;當client執行INSERT操作時Server便會自動取得該table的WRITE LOCK。隱性LOCK的有效期限只限於單一Statement的執行期,一但該Statement的執行完畢系統便會自動釋放LOCK。
- 顯性的LOCK是由Client明確的以指令告知Server進行資料表的鎖定,例如client可以使用LOCK TABLES或UNLOCK TABLES來鎖定或解除鎖定資料表,但要注意只有LOCK的擁有者才可以解除資料表的鎖定。若是鎖定table的client解除鎖定前便斷線,則系統會自動解除資料表的鎖定。
LOCK的層級與支援的Storage Engine:www-slime-com-tw- Table Lock-MyISAM, MEMORY, MERGE
- Page Lock-BDB
- Row Lock-InnoDB
要使用顯性LOCK必須要具備的權限:www-slime-com-tw- LOCK TABLES
- SELECT (對所有被LOCK的table都要有SELECT權限)
LOCK的種類與效果:www-slime-com-tw- READ
當某一client取得table的READ LOCK後,其他的client仍然可以對該table進行讀取,但不能執行任何寫入的操作,就算是LOCK的擁有者也是只能讀、不能寫。可以由多個不同的client對同一個table同時進行READ LOCK。
- WRITE
當某一client取得table的WRITE LOCK後,只有LOCK的擁有者可以對table進行讀取或寫入,其他的client皆無法對table進行讀取或寫入。只可以由單一client對同一個table進行WRITE LOCK。
- READ LOCAL
與READ LOCK效果相同,但是允許client進行INSERT操作,前提是使用的Storage Engine必須是MyISAM並且不能有holes(若是有holes則必需先對table進行最佳化)。若是使用在Storage Engine不為MyISAM的table或是table有holes,則效果等同於READ LOCK。
- LOW_PRIORITY WRITE
當你要對table進行一般的WRITE LOCK時,若有其他client正在使用該table則你必須要等待其他client使用完畢後才可取得WRITE LOCK;若是在等待期間又有其他client打算讀取該table(取得READ LOCK),則要排隊在你的後面。若是使用LOW_PRIORITY WRITE LOCK,則在等待期間若有其他client打算讀取該table(取得READ LOCK),他們將會插隊到你的前面,也就是它們的優先權在你之上。
LOCK與Transaction之間的交互影響:www-slime-com-tw當執行START TRANSACTION時,系統會自動UNLOCK你所擁有的LOCK;當執行 LOCK TABLES、UNLOCK TABLES時,系統會自動COMMIT該transaction。
Advisory Locking:www-slime-com-tw這嚴格說起來並不是一種真正的Lock機制,而是利用function來模擬Lock機制而已,它並沒有辦法強制禁止其他client存取被你LOCK住的table。
常用的function:www-slime-com-tw- GET_LOCK
- RELEASE_LOCK
- IS_FREE_LCOK
- IS_USED_LOCK
參考資料: www^slime^com^tw
Paul Dubois, Stefan Hinz, Carsten Pedersen(2005), “MySQL 5.0 Certification Study Guide.”
|
|
|
送花文章: 8870,
收花文章: 2195 篇, 收花: 5820 次
|