首页 > 其他 > 详细

for update 锁行和锁表

时间:2020-07-07 19:49:52      阅读:57      评论:0      收藏:0      [点我收藏+]

【钱包扣钱】事务中:

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

for update 锁行和锁表

原文:https://www.cnblogs.com/muxueyuan/p/13262396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!