如果了解過檔案鎖的用法,那理解資料庫鎖就簡單了。鎖其實就協調多個程序或執行緒併發時,處理訪問同乙個資源的機制。在專案開發中,表鎖是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...