MyISAM儲存引擎的表級鎖

2021-09-27 18:07:39 字數 3231 閱讀 5689

如果了解過檔案鎖的用法,那理解資料庫鎖就簡單了。鎖其實就協調多個程序或執行緒併發時,處理訪問同乙個資源的機制。在專案開發中,表鎖是mysql中作用範圍較大的一種鎖,它鎖定的是使用者操作的整張表,可以有效避免死鎖的情況,且加鎖速度快,消耗資源小。事情總有兩面性,也就是因為表鎖是鎖了整張表,在併發的時候鎖衝突更大,併發能力也就差

表鎖根據操作的不同分為表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock)

1.讀鎖

讀鎖表示使用者讀取資料(select)時新增的鎖,此時不會阻塞其他使用者對同一張表的讀操作,但是會阻塞對同一張表的寫請求

2.寫鎖

寫鎖表示使用者對資料資源執行寫(insert、update、delete)操作時新增的鎖,此時除了當前新增寫鎖的使用者外,其他使用者都不能對錶進行讀、寫操作,也就是說會阻塞其他使用者對同一張表的讀、寫操作

myisam表的讀操作與寫操作,以及寫操作之間是序列的

當使用者操作select查詢資料表時(myisam表),mysql伺服器會自動地為查詢的表新增乙個表讀鎖;當執行增刪改(insert、delete、update)操作時,同樣mysql伺服器也會自動地為操作的表新增乙個表寫鎖;直到操作結束完畢,伺服器為其自動解鎖。

mysql> select * from order_step;
查詢一張7萬記錄的表,注意表的儲存引擎為myisam; 查詢時間差不多3-5秒。此時新開乙個終端,執行更新操

mysql> update order_step set statusinner=

2001 where stepid=

75584

;// 等待上乙個終端執行結束

隱式加鎖的時候,表的更新操作優先順序高於表的查詢操作。在新增寫鎖時,若表中沒有任何鎖則新增,否則排隊等待。在新增讀鎖時,若表中沒有寫鎖則新增,否則也將排隊等待

使用者一般不需要直接用lock table命令給myisam表顯示加鎖。我們為了學習,顯示加鎖來在一定程度模擬事務操作

lock

tables 資料表名 read

[local

]write,.

...

1.建立myisam表,準備實驗環境
create

table `user`(

id int

primary

keyauto_increment

,`username` varchar(50

),`money` decimal(7

,2))

engine

=myisam charset

=utf8;

insert

into

user

(`username`,`money`)

values

('喬峰',5

);

2.顯式加表鎖

終端a:在自己操作表的時候,不希望其他使用者去修改這這個表的資料

mysql> lock tables user read;

query ok

,0 rows affected (

0.00 sec)

mysql> select * from user;+--

--+----

-------

+--------+

| id | username | money |+--

--+----

-------

+--------+

|1| 喬峰 |

5.00|+

----+--

----

-----+

----

----

+1 rows in set (

0.00 sec)

終端b:

mysql> update user set money=money+

5 where id=1;

// 等待終端a 釋放鎖

終端a:釋放鎖

mysql> unlock tables;

query ok

,0 rows affected (

0.00 sec)

3.支援併發時插入

在上面例子中,當終端a沒有釋放鎖的時候,此時終端是不能update的,同時也不能insert。

mysql> insert into user

(username,money)

values

('張三'

,'100');

// 插入等待

考慮到併發的情況,我們在加鎖的時候新增local選項。讓其支援併發時插入

mysql> lock tables user read local;

query ok

,0 rows affected (

0.00 sec)

mysql> show status like 'table%';+

----

----

----

----

----

----

----+--

-----+

| variable_name | value |+--

----

----

----

----

----

------+

-------

+| table_locks_immediate |86|

| table_locks_waited |0|

| table_open_cache_hits |2|

| table_open_cache_misses |0|

| table_open_cache_overflows |0|

+------

----

----

----

----

------+

-------

+5 rows in set (

0.01 sec)

MyISAM儲存引擎

myisam是預設儲存引擎。它基於更老的isam 但有很多有用的擴充套件。注意mysql 5.1不支援isam 每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。frm檔案儲存表定義。資料檔案的擴充套件名為.myd mydata 索引檔案的副檔名是.myi ...

MyISAM儲存引擎

支援事務,支援外來鍵,尤其是訪問速度快,對事務完 整性沒有要求或者以select insert為主的應用基本都可以使用這個引擎來建立表。每個myisam在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為 1 frm 儲存表定義 2 myd mydata,儲存資料 3 myi myinde...

MyISAM儲存引擎

支援事務,支援外來鍵,尤其是訪問速度快,對事務完 整性沒有要求或者以select insert為主的應用基本都可以使用這個引擎來建立表。每個myisam在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為 1 frm 儲存表定義 2 myd mydata,儲存資料 3 myi myinde...