資料庫學習 MySQL鎖

2021-09-05 12:16:56 字數 2980 閱讀 3967

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制

顯著特點是不同的儲存引擎支援不同的鎖機制

兩種模式:表 共享鎖【讀鎖】(級別) > 表 獨佔鎖【排他鎖/寫鎖】​

表級鎖的儲存引擎:

myisam:引擎

memory:引擎

不能訪問別的表

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

在執行(update、delete、insert)前,會自動給表加寫鎖

lock table 表名 read [local],

lock table 表名 write [local]

多表加鎖:

lock table 表名1,表名2 read/write [local]

unlock tables;
show status like 'table%'

table_locks_immediate:加鎖次數

table_locks_waited : 等待次數

show status like '%lock%' # 看到的更全面

show processlist #此命令可以檢視那些sql在等待鎖

show open tables #當前被鎖住的表以及鎖的次數

加鎖帶來的問題

myisam有乙個系統變數concurrent_insert,專門用以控制其併發插入的行為,其值分別對應為0,1,2

concurrent_insert=0,不允許併發插入【never】

concurrent_insert=1,如果myisam沒有空洞(即表的中間沒有被刪除的行),myisam允許在乙個程序讀表的同時,另乙個程序從表尾插入記錄,【預設設定】【auto】

concurrent_insert=2,無論有沒有空洞,都在表尾插入【always】

會產生碎片,用optimize table 表名;解決(優化)

預設情況下,寫 > 讀

設定:

max_write_lock_count=次數

鎖次數=次數值時,執行讀操作

有了這樣的設定,當系統處理乙個寫操作後,就會暫停寫操作,給讀操作執行的機會。

low_priority_updates=1  降低寫的優先順序

sql_low_priority_updates=1

預設值為0

寫語句變更為:

update/insert/delete/... low_priority

再用

max_allowed_packet=1m  #限制接受的資料報的大小,大的插入和更新會被限制掉,導致失敗

net_buffer_length=2k-16m #設定insert語句快取值,多資料同時插入(),(),()。。。

bulk_insert_buffer_size=8m # 一次性insert語句插入的大小

第一種情況是:事務需要更新大部分或全部資料,表又比較大,如果使用預設的行鎖,不僅這個事務執行效率低,而且可能造成其他事務長時間鎖等待和鎖衝突,這種情況下可以考慮使用表鎖來提高該事務的執行速度。

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

行級鎖模式

讀鎖/共享鎖(s):允許乙個事務去讀一行,組織其他事務獲得相同資料集的排他鎖;

​ 允許其他執行緒上讀鎖,但是不允許上寫鎖。

寫鎖/排他鎖(x):允許獲得排他鎖的事務更新資料,組織其他事務取得相同資料集的共享讀鎖和排他鎖

​ 不允許其他執行緒上任何鎖。

意向共享鎖(is):事務打算給資料行加行共享鎖,事務在給乙個資料行加鎖前必須先取得該錶的is鎖;為防止形成死鎖

意向排他鎖(ix):事務打算給資料加行排他鎖,事務在給乙個資料行加排他鎖前必須取得該錶的ix鎖;為防止形成死鎖【不主張用】

相容xix

sisx×

×××ix

×相容×相容

s××相容

相容is×相容

相容相容

如果乙個事務請求的鎖模式與當前鎖相容,innodb就將請求的鎖授予該事務;

反之。不相容,該事務就要等待鎖釋放

行級鎖的儲存引擎:innodb

意向共享鎖/讀鎖:select ***** lock in share mode

意向排他鎖/寫鎖:select ***** for update

commit

rollback

當我們給某一條資料上了排他鎖:

其他人操作不了這條資料;想操作。排隊,等其他人釋放(commit;)

其他人對這條資料沒有任何許可權,但是並不影響其他客戶修改其他資料

能查詢,但是查不到最新的【隔離】

即使欄位加了索引,但是你在使用偷換了資料型別,那麼索引失效,最終加上表鎖【0 》 『0 』】

操作的資料的自增值中間有間隙的時候,將間隙(缺的部分)自動鎖起來

也能鎖住不存在的條件(一般為子增值)

鎖住範圍內的所有資料 =》 指定條件的時候給乙個確定的範圍

造成阻塞

show status like 'innobd_row_lock%'

innobd_row_lock_waits innobd_row_lock_time_

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...

mysql資料庫鎖

表鎖 讀鎖會阻塞寫,但是不會阻塞讀操作。而寫鎖則會把讀和寫都阻塞 myisam索引結構 myisam索引用的b tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料。b tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實...

MySQL資料庫鎖

mysql鎖分為表級鎖 頁級鎖和行級鎖。innodb 行級鎖 在特殊情況下會公升級為表級鎖,如給沒有加索引的非唯一字段加鎖,或者在普通索引中,使用模糊查詢使索引失效,導致加鎖時,公升級為表鎖 myisam 表級鎖 排他鎖又稱為寫鎖,乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖,也修...