常用命令
手動新增表鎖
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...