MySQL鎖的用法之表級鎖

2021-12-29 21:22:32 字數 2387 閱讀 4394

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 兩...