當前位置: 妍妍網 > 碼農

面試官問:select......for update會鎖表還是鎖行?

2024-05-17碼農

大家好,我是鵬磊。

select查詢語句是不會加鎖的,但是select .......for update除了有查詢的作用外,還會加鎖呢,而且它是悲觀鎖。

那麽它加的是行鎖還是表鎖,這就要看是不是用了索引/主鍵。

沒用索引/主鍵的話就是表鎖,否則就是是行鎖。

驗證:

建表sql

//id為主鍵
//name 為唯一索引
CREATE TABLE user(
 id INT ( 11 )
 NOT NULL AUTO_INCREMENT,
 name VARCHAR255 ) DEFAULT NULL,
 age INT11 ) DEFAULT NULL,
code VARCHAR255 ) DEFAULT NULL,
 PRIMARY KEY( id ),
KEY idx_age( age ) USING BTREE 
) ENGINE 
= INNODB AUTO_INCREMENT = 1570068 DEFAULT CHARSET = utf8

需要關閉自動送出,透過set @@autocommit=0; 設定為手動送出。0代表手動送出,1代表自動送出。

結合一下例項驗證

例項1:

使用主鍵id為條件去查詢,然後開啟另一個事務去更新數據,更新被阻塞,加鎖了,釘選要查詢的id為1的行數據。

圖一為第一個事務,並且沒有送出事務

圖二為第二個事務,去更新數據,被阻塞了

圖三為第二個事務,長時間拿不到鎖報錯。

例項2:

我們在開啟一個事務對另一條id為2的數據進行更新,

例項3(索引):

一開始的建立表就age建立了唯一索引。

例項4:

使用普通的欄位code去操作

另一個事務我去更新另外一條數據,如果我更新成功了,就是鎖行,失敗了就是鎖表。

結果:

如果查詢條件用了索引/主鍵,那麽select ..... for update就會進行行鎖。

如果是普通欄位(沒有索引/主鍵),那麽select ..... for update就會進行鎖表。