mysql中的表鎖

2021-09-21 05:55:36 字數 2120 閱讀 3170

表鎖的優勢:開銷小;加鎖快;無死鎖

表鎖的劣勢:鎖粒度大,發生鎖衝突的概率高,併發處理能力低

加鎖的方式:自動加鎖。查詢操作(select),會自動給涉及的所有表加讀鎖,更新操作(update、delete、insert),會自動給涉及的表加寫鎖。也可以顯示加鎖:

共享讀鎖:lock table tablename read;

獨佔寫鎖:lock table tablename write;

批量解鎖:unlock tables;

對myisam表的讀操作(加讀鎖),不會阻塞其他程序對同一表的讀操作,但會阻塞對同一表的寫操作。只有當讀鎖釋放後,才能執行其他程序的寫操作。在鎖釋放前不能讀取,操作其他表。

示例:

lock table student read  # 加共享讀鎖

select * from student # 查詢後有結果

select * from emp #查詢其他表,報table 'emp' was not locked with lock tables 即該錶沒有共享讀鎖,不能操作

update student set s_name='zhao' where s_id='01' # table 'student' was locked with a read lock and can't be updated 即 唯讀不能操作

unlock tables; #批量解鎖

另外再開乙個程序

select * from student  # 另開以程序,發現可讀

select * from emp # 另開以程序,發現可讀

update student set s_name='趙' where s_id='01' # 另開以程序,發現進入鎖等待,可能發生死鎖

當我們釋放所有的鎖時,批量解鎖:unlock tables;

unlock tables;
會發現,剛才在等待的 update 語句執行完畢。

再次證明:表加共享讀鎖後,不會阻塞其他程序對同一表的讀操作,但會阻塞對同一表的寫操作。只有當讀鎖釋放後,才能執行其他程序的寫操作。在鎖釋放前不能讀取,操作其他表。

對myisam表的寫操作(加寫鎖),會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作。在鎖釋放前不能寫其他表。

lock table student write; #加表寫鎖

update student set sname='zhao' where s_id='01'; #正常執行

select * from student;#正常執行

select * from emp;#table 'innodb_lock' was not locked with lock tables

update emp set v='1001' where k='1';#table 'innodb_lock' was not locked with lock tables

unlock tables #釋放鎖

另外開一程序

select * from student;#進入等待
當我們釋放所有的鎖時,批量解鎖:unlock tables;

unlock tables;
查詢語句執行

總結證明:表加獨佔寫鎖,會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作。在鎖釋放前不能寫其他表。

innodb預設採用行鎖,在未使用索引字段查詢時公升級為表鎖。mysql這樣設計並不是給你挖坑。它有自己的設計目的。

即便你在條件中使用了索引字段,mysql會根據自身的執行計畫,考慮是否使用索引(所以explain命令中會有possible_key 和 key)。如果mysql認為全表掃瞄效率更高,它就不會使用索引,這種情況下innodb將使用表鎖,而不是行鎖。因此,在分析鎖衝突時,別忘了檢查sql的執行計畫,以確認是否真正使用了索引。

第二種情況:多表查詢。事務涉及多個表,比較複雜的關聯查詢,很可能引起死鎖,造成大量事務回滾。這種情況若能一次性鎖定事務涉及的表,從而可以避免死鎖、減少資料庫因事務回滾帶來的開銷。

Mysql中的表鎖 行鎖

行鎖 innodb行鎖是通過索引上的索引項來實現的,這一點 ysql與oracle不同,後者是通過在資料中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味者 只有通過索引條件檢索資料,innodb才會使用行級鎖,否則,innodb將使用表鎖。間隙鎖當用範圍條件而不是相等條件檢索資料,並請求...

mysql 鎖等待表 MySQL表的鎖等待

今天線上業務遇到乙個問題,因為一張模擬自增序列的表被鎖住,涉及該錶的業務受到影響。線上情況 1 這個表只有乙個id欄位。今天線上業務遇到乙個問題,因為一張模擬自增序列的表被鎖住,涉及該錶的業務受到影響。線上情況 1 這個表只有乙個id欄位。2 id欄位為主鍵索引 3 該錶只有一行資料,記錄全域性最大...

MySQL中的全域性鎖和表級鎖

資料庫鎖設計的初衷是解決併發出現的一些問題。當出現併發訪問的時候,資料庫需要合理的控制資源的訪問規則。而鎖就是訪問規則的重要資料結構。根據鎖的範圍,分為全域性鎖 表級鎖和行級鎖三類。全域性鎖就是對整個資料庫例項加鎖。mysql提供而乙個全域性讀鎖的方法。命令是 flush tables with r...