我們在數據庫執行update語句的時候,到底是鎖表還是鎖行?這里直接用MySQL上例子測試下。
一、環境準備
1、新建一個表
create table test_update(
id BIGINT not null primary key COMMENT '主鍵ID,雪花算法生成',
name VARCHAR(100) COMMENT '姓名',
user_no VARCHAR(20) COMMENT '用戶編號'
);
2、插入兩條數據
insert into test_update(id,name,user_no)values(1,'張三','001');
insert into test_update(id,name,user_no)values(2,'李四','002');
二、開始測試
場景一:不加索引
開啟事務
sql1:update test_update set name=’張三1’ where user_no in(‘001’);
不提交事務
開啟事務
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事務
我們發現在sql1不提交事務的情況下,sql2被阻塞了,只有當sql1的事務提交后sql2才會執行成功。
總結:在不加索引的情況下,update語句鎖表。
場景二:加索引
先在user_no加索引
ALTER TABLE test_update ADD INDEX index_name (user_no);
開啟事務
sql1:update test_update set name=’張三1’ where user_no in(‘001’);
不提交事務
開啟事務
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事務
我們發現在sql1不提交事務的情況下,sql2也執行成功了,也就是sql2不依賴于sql1的事務提交。
總結:在加索引的情況下,update語句鎖行。
場景三:加索引,但是in里面是復雜查詢
上面的例子in里面都是確定的值,加入in里面是查詢出來的呢,如下例子(user_no已經加上索引)
開啟事務
sql1:update test_update set name=’張三1’ where user_no in(select user_no from other_table where id=1);
不提交事務
開啟事務
sql2:update test_update set name=’李四1’ where user_no in(select user_no from other_table where id=2);
提交事務
我們發現在sql1不提交事務的情況下,sql2被阻塞了,只有當sql1的事務提交后sql2才會執行成功,跟場景一結果一樣。
總結:在加索引的情況下,in里面是不確定的值,update語句鎖表。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。