注意 FOR UPDATE 僅適用于InnoDB,且必須在事務(wù)區(qū)塊(BEGIN/COMMIT)中才能生效碱妆。
由于InnoDB 預(yù)設(shè)是Row-Level Lock瘦真,所以只有「明確」的指定主鍵,MySQL 才會(huì)執(zhí)行Row lock (只鎖住被選取的數(shù)據(jù)) ,否則MySQL 將會(huì)執(zhí)行Table Lock (將整個(gè)數(shù)據(jù)表單給鎖住)丐重。
例如下面幾種情況
A.假設(shè)有個(gè)表單products 捅位,里面有id 跟name 二個(gè)欄位轧葛,id 是主鍵。
(明確指定主鍵艇搀,并且有此數(shù)據(jù)尿扯,row lock也就是行鎖)
SELECT * FROM products WHERE id='3' FOR UPDATE;
B.(明確指定主鍵,若查無此數(shù)據(jù)焰雕,無lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
C.(無主鍵衷笋,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
D?.(主鍵不明確,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
要測(cè)試鎖定的狀況淀散,可以利用MySQL 的Command Mode 右莱,開二個(gè)視窗來做測(cè)試
MySQL update && select
CREATE TABLE `testupdate` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`val` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
update testupdate
set val = val+1
where id = 1 and @value := val+1;
select @value;