分析表鎖定
//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;