【钱包扣钱】事务中:
//事务
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