mysql鎖表的原因是什麼

WBOY
發布: 2022-01-20 10:30:58
原創
11508 人瀏覽過

在mysql中,鎖定表的原因是一個程式執行了對錶的insert、update或delete操作還未commite時,另一個程式也對同一個表進行相同的操作,則此時會發生資源正忙的異常,也就是鎖定表。

mysql鎖表的原因是什麼

本教學操作環境: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的記錄那麼:

    則 set ='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):語句 1):語句 1):語句 1):語句。 1 delete from table where kid1=1 and kid2=2;

  2):語句2 delete from table where kid1=1 ;

      # 這樣的兩個delete 會鎖定表

總結:同一個表,如果進行刪除操作時,盡量讓刪除條件統一,否則會相互影響造成鎖定表

推薦學習:mysql視頻教程

#

以上是mysql鎖表的原因是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板