在mysql中,鎖表的原因是一個程序執行了對表的insert、update或者delete操作還未commite時,另一個程序也對同一個表進行相同的操作,則此時會發生資源正忙的異常,也就是鎖表。
本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
mysql鎖表的原因是什么
在數據庫中,除傳統的計算資源(如CPU、RAM、I/O等)的爭用以外,數據也是一種供許多用戶共享的資源。
如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素。
從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加復雜。
鎖表的原因
1、鎖表發生在insert update 、delete 中
2、鎖表的原理是 數據庫使用獨占式封鎖機制,當執行上面的語句時,對表進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶
第一、 A程序執行了對 tableA 的 insert ,并還未 commite時,B程序也對tableA 進行insert 則此時會發生資源正忙的異常 就是鎖表
第二、鎖表常發生于并發而不是并行(并行時,一個線程操作數據庫時,另一個線程是不能操作數據庫的,cpu 和i/o 分配原則)
3、減少鎖表的概率:
減少insert 、update 、delete 語句執行 到 commite 之間的時間。
具體點批量執行改為單個執行、優化sql自身的非執行速度 如果異常對事物進行回滾
示例如下:
使用 update??
假設kid 是表table 的 一個索引字段 且值不唯一:
1):如果kid 有多個值為12的記錄那么:
update table set name=’feie’ where kid=12;? ?#會鎖表
2):如果kid有唯一的值為1的記錄那么:
update table set name=’feie’ where kid=1;? ?#不會鎖
總結:用索引字段做為條件進行修改時, 是否表鎖的取決于這個索引字段能否確定記錄唯一,當索引值對應記錄不唯一,會進行鎖表,相反則行鎖。
使用?delete
如果有兩個delete :?kid1 與 kid2 是索引字段
1):語句1 delete from table where kid1=1 and kid2=2;
2):語句2 delete from table where kid1=1 and kid2=3;
? #?這樣的兩個delete 是不會鎖表的
1):語句1 delete from table where kid1=1 and kid2=2;
2):語句2 delete from table where kid1=1 ;
? #?這樣的兩個delete 會鎖表
總結:同一個表,如果進行刪除操作時,盡量讓刪除條件統一,否則會相互影響造成鎖表
推薦學習:mysql視頻教程