for update 鎖行和鎖表

2021-10-07 20:58:53 字數 947 閱讀 4701

【錢包扣錢】事務中:

//事務

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

oracle 的for update行鎖語法

select.for update 語句的語法如下 select for update of column list wait n nowait skip locked 其中 of 子句用於指定即將更新的列,即鎖定行上的特定列。wait 子句指定等待其他使用者釋放鎖的秒數,防止無限期的等待。使用fo...

全域性鎖 表鎖和行鎖

全域性鎖就是對整個資料庫例項加鎖,mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock。讓你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 a 資料更新語句 b 資料定義語句 c 更新類事務的提交語句 mysql裡面...

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...