for update 鎖行和鎖表


【錢包扣錢】事務中:

//事務
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM