SQL5

分析表鎖定

//1說(shuō)明被加了鎖
show open tables;

行鎖(InnoDB)

一次鎖定一行

create table linelock(
id int(5) primary key auto_increment,
name varchar(20)
)engine = innodb;
insert into linelock(name) values('1');
insert into linelock(name) values('2');
insert into linelock(name) values('3');
insert into linelock(name) values('4');
insert into linelock(name) values('5');
//增刪改查會(huì)自動(dòng)添加提交
commit;

為了研究行鎖,自動(dòng)關(guān)閉

set autocommit = 0;

插入一條數(shù)據(jù)

insert into linelock values(6,'a6');

此時(shí)還沒(méi)有commit,還在緩存里面

此時(shí)另外一個(gè)會(huì)話進(jìn)來(lái)了

update linelock set name='ax' where id=6;

更新的時(shí)候發(fā)現(xiàn)數(shù)據(jù)被加鎖了。知道其他會(huì)話將該鎖釋放掉了
可以通過(guò)rollback滾回去

總結(jié)

  • 一個(gè)會(huì)話對(duì)數(shù)據(jù)進(jìn)行DML操作,則其他會(huì)話會(huì)等待上一個(gè)會(huì)話提交才能操作。
  • 表鎖是通過(guò)unlock tables解鎖,行鎖是通過(guò)commit/rollback;

行鎖注意事項(xiàng)

  • 如果沒(méi)有索引,則行鎖會(huì)轉(zhuǎn)換成表鎖,索引失效 -> 行鎖變成表鎖
  • 表鎖可以通過(guò)commit解鎖
  • 行鎖一張?zhí)厥馇闆r:間隙鎖:值在范圍內(nèi),但是不存在,比如id沒(méi)有7,我們會(huì)自動(dòng)給7加一個(gè)間隙鎖
    總結(jié)
    InnoDB
  • 缺點(diǎn) 行鎖鎖性能消耗大
  • 優(yōu)點(diǎn) 高并發(fā)
    行鎖分析
    show status like '%innodb_row_lock%';
    Innodb_row_lock_current_waits:當(dāng)前等待鎖的數(shù)量
    Innodb_row_lock_time:等待總時(shí)長(zhǎng)

對(duì)查詢進(jìn)行行鎖,加上for update

select * from linelock where id = '3' for update;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容