mysql鎖的用法之表級鎖
鎖機制是資料庫有別於檔案系統的乙個重要的特點,也是用來管理併發訪問的乙個有效的方式。mysql的鎖分為表級鎖、頁級鎖與行級鎖。表級鎖是mysql中粒度最大的一種鎖,它實現簡單,資源消耗較少,被大部分mysql引擎支援。最常使用的myisam與innodb都支援表級鎖定。
表級鎖定分為兩類,讀鎖與寫鎖。讀鎖是預期將對資料表進行讀取操作,鎖定期間保證表不能被修改。寫鎖是預期會對資料表更新操作,鎖定期間保證表不能被其他執行緒更新或讀取。
www.2cto.com
讀鎖:
用法: lock table table_name [ as alias_name ] read
指定資料表,lock型別為read即可,as別名是可選引數,如果指定別名,使用時也要指定別名才可
申請讀鎖前提:當前沒有執行緒對該資料表使用寫鎖,否則申請會阻塞。
操作限制:其他執行緒可以對鎖定表使用讀鎖;其他執行緒不可以對鎖定表使用寫鎖
寫操作 讀操作
使用讀鎖線程 否(報錯) 能
不使用讀鎖線程 否(阻塞) 能
對於使用讀鎖的mysql執行緒,由於讀鎖不允許任何執行緒對鎖定表進行修改,在釋放鎖資源前,該執行緒對錶操作只能進行讀操作,寫操作時會提示非法操作。而對於其他沒使用鎖的mysql執行緒,對鎖定表進行讀操作可以正常進行,但是進行寫操作時,執行緒會等待讀鎖的釋放,當鎖定表的所有讀鎖都釋放時,執行緒才會響應寫操作。
寫鎖:用法: lock table table_name [as alias_name] [ low_priority ] write
別名用法與讀鎖一樣,寫鎖增加了指定優先順序的功能,加入low_priority可以指定寫鎖為低優先順序。
申請寫鎖前提: 當沒有執行緒對該資料表使用寫鎖與讀鎖,否則申請回阻塞。
www.2cto.com
操作限制:其他mysql執行緒不可以對鎖表使用寫鎖、讀鎖
寫操作 讀操作
使用寫鎖線程 能 能
不使用寫鎖線程 否(阻塞) 能(阻塞)
對於使用寫鎖的mysql執行緒,其可以對鎖定表進行讀寫操作。但是對於其他執行緒,對指定表讀寫操作都是非法的,需要等待直到寫鎖釋放。
鎖分配優先順序:
對於鎖分配的優先順序,是: low_priority write < read < write
1. 當多個執行緒申請鎖,會優先分配給write鎖,不存在write鎖時,才分配read鎖,low_priority write需要等到write鎖與read都釋放後,才有機會分配到資源。
2. 對於相同優先順序的鎖申請,分配原則為誰先申請,誰先分配。
注意事項:
1. 不能操作(查詢或更新)沒有被鎖定的表。
例如當只申請table1的讀鎖,sql語句中包含對table2的操作是非法的。例如:
www.2cto.com
mysql> lock table test read;
query ok, 0 rows affected (0.00 sec)
mysql> select * from test_myisam;
error 1100 (hy000): table 'test_myisam' was not locked with lock tables
2. 不能在乙個sql中使用兩次表(除非使用別名)
當sql語句中多次使用一張表時,系統會報錯。例如:
mysql> lock table test read;
query ok, 0 rows affected (0.00 sec)
mysql> select * from test where id in (select id from test );
error 1100 (hy000): table 'test' was not locked with lock tables
解決這個問題的方法是使用別名,如果多次使用到乙個表,需要宣告多個別名。
mysql> lock table test as t1 read, test as t2 read;
query ok, 0 rows affected (0.00 sec)
mysql> select * from test as t1 where id in (select id from test as t2);
+----+-----------+ www.2cto.com
| id | content |
+----+-----------+
| 1 | tt_1 |
| 3 | new_3 |
| 4 | new_4 |
| 5 | content_5 |
+----+-----------+
4 rows in set (0.00 sec)
3. 申請鎖時使用別名,使用鎖定表時必須加上別名。
MySQL鎖的用法之行級鎖
行級鎖是mysql中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。但是粒度越小,實現的成本也越高。myisam引擎只支援表級鎖,而innodb引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩種。共享鎖允許事物讀一...
MySQL鎖的用法之行級鎖
行級鎖是mysql中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。但是粒度越小,實現的成本也越高。myisam引擎只支援表級鎖,而innodb引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩種。共享鎖允許事物讀一...
MySQL鎖的用法之行級鎖
行級鎖是 mysql 資料庫 中粒度最小的一種鎖,他能大大減少 資料庫 操作的衝突。但是粒度越小,實現的成本也越高。myisam 引擎只支援表級鎖,而 innodb 引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩...