天天看點

面試官:select......for update 會鎖表還是鎖行?别答錯了……

驗證:

建表sql

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

需要關閉自動送出,通過

set @@autocommit=0;

設定為手動送出。0代表手動送出,1代表自動送出。

面試官:select......for update 會鎖表還是鎖行?别答錯了……

結合一下執行個體驗證

執行個體1:

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

  • 圖一為第一個事務,并且沒有送出事務
  • 圖二為第二個事務,去更新資料,被阻塞了
  • 圖三為第二個事務,長時間拿不到鎖報錯。
  • 面試官:select......for update 會鎖表還是鎖行?别答錯了……
  • 執行個體2:

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

面試官:select......for update 會鎖表還是鎖行?别答錯了……
面試官:select......for update 會鎖表還是鎖行?别答錯了……
面試官:select......for update 會鎖表還是鎖行?别答錯了……
面試官:select......for update 會鎖表還是鎖行?别答錯了……