mysql行鎖的特性 MySql的表鎖行鎖及間隙鎖

2021-10-17 11:31:20 字數 1849 閱讀 4879

常用命令

手動新增表鎖

lock table 表名稱 read(write),表名稱2 read(write);

檢視表上加過的鎖

show open tables;

刪除表鎖

unlock tables;

1.表鎖

特點:1.每次操作鎖住整張表,開銷小,加鎖快;

2.不會出現死鎖;

3.鎖定粒度大,發生鎖衝突的概率最高,併發度最低;

1.1 對錶加讀鎖

例如:先執行lock table jarye_lock_myisam read;

在執行insert intojarye_lock_myisam (id, name) values ('6', 'xiaomin');

報錯:[err] 1099 - table 'jarye_lock_myisam' was locked with a read lock and can't be updated

當前session和其他session都可以讀該表

當前session中插入或者更新鎖定的表都會報錯,其他session插入或更新則會等待

select * from jarye_lock_myisam;

1.2 對錶加寫鎖

例如:先執行lock table jarye_lock_myisam write;

當前session對該錶的增刪改查都沒有問題,其他session對該錶的所有操作被阻塞

1.3 總結

表鎖中的讀寫鎖區別:

讀鎖會阻塞寫,不會阻塞讀。

寫鎖則會把讀寫都阻塞。

表鎖的加鎖/解鎖方式:(不需要使用者干預,必須要顯示的加lock table命令)

myisam 在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖;

在執行更新操作 (update、delete、insert 等)前,會自動給涉及的表加寫鎖

2.行鎖

特點:1.每次操作鎖住一行資料,開銷大,加鎖慢;

2.會出現死鎖;

3.鎖定粒度最小,發生鎖衝突的概率最低,併發度最高。

行鎖公升級為表鎖的情況

修改的時候查詢的條件不是索引字段,則會走全表掃瞄。

全表掃瞄的時候對每行資料都加上行鎖,最終形成表鎖。其他任何行的操作都會被表鎖,示例如下:

sessiona操作:

begin;

update jarye_account set name='jarye6' where balance='300';

commit;

在沒commit的時候,會形成鎖表,只能刪除表鎖unlock tables;

3.間隙鎖

間隙鎖是乙個在索引記錄之間的間隙上的鎖。

sessiona操作:

begin;

update jarye_account set name='jarye6' where id>18 and id<22;

commit;

從id>18 and id <22 上了間隙鎖,在沒有釋放鎖的時候 其他的session無法對該段位做操作。

sessionb

insert into `jarye_account` values (19, 'jarye19', '500');

主鍵索引或者唯一索引會使用間隙鎖嗎

1.如果where條件都命中的情況下,則不會發生間隙鎖,只會增加記錄鎖

2.如果where條件部分命中或者全部沒有命中的情況下,則使用間隙鎖

4.優化注意事項

1.盡可能讓所有資料檢索都通過索引來完成,避免無索引行鎖公升級為表鎖

2.盡可能減少檢索條件範圍,避免間隙鎖

3.盡量控制事務大小,減少鎖定資源量和時間長度,涉及事務加鎖的sql盡量放在事務最後執行

mysql 行鎖 訂票 mysql 行鎖

在電子商務裡,經常會出現庫存數量少,購買的人又特別多,大併發情況下如何確保商品數量不會被多次購買.其實很簡單,利用事務 for update就可以解決.我們都知道for update實際上是共享鎖,是可以被讀取的.但是如何在執行時,不被讀取呢.簡單來說 假設現在庫存為1,現在有a和b同時購買 先開啟...

mysql行鎖詳解 詳解MySQL行鎖

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。鎖保證資料併發訪問的一致性 有效性 鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。鎖是mysql在伺服器層和儲存引擎層的的併發控制。mysql中從對資料操作的粒度分為表鎖和行鎖。表鎖是指對一整張表加鎖,一般是 ddl 處理時使用 而行鎖則是鎖定...

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...