【錢包扣錢】事務中:
//事務
SELECT balance FROM 'account' WHERE id = 1 FROM UPDATE //判斷錢包是否大於需要扣除的金額,例如100 UPDATE 'account' SET balance = balance - 100 WHERE id =1 //提交事務
在未提交事務之前,其他人使用for update語句查詢這個時候會出現被鎖住,無法被讀取。保證准確性
SELECT ... FOR UPDATE 的Row Lock 與Table Lock
只有「明確」的指定主鍵,MySQL 才會執行Row lock (只鎖住被選取的數據) ,否則MySQL 將會執行Table Lock (將整個數據表單給鎖住)。
示例:
表account 其中主鍵為id
SELECT * FROM 'account' WHERE id='3' FOR UPDATE;
有主鍵,並且有此數據,row lock
SELECT * FROM 'account' WHERE id='-1' FOR UPDATE;
主鍵,若查無此數據,無lock
SELECT * FROM 'account' WHERE name='小樹' FOR UPDATE;
無主鍵,table lock
SELECT * FROM 'account' WHERE id<>'3' FOR UPDATE; SELECT * FROM 'account' WHERE id>'3' FOR UPDATE; SELECT * FROM 'account' WHERE id LIKE '3' FOR UPDATE;
主鍵不明確,table lock