前言
前几天,知识星球中的一个小伙伴,问了我一个问题:在MySQL中,事务A中使用select...for update where id=1锁住了,某一条数据,事务还没提交,
此时,事务B中去用select ... where id=1查询那条数据,会阻塞等待吗?
其实select...for update在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住,导致SQL性能急剧下降。
其实,我之前也在实际项目中试过用for update关键字加行锁,比如:积分兑换礼品的功能。
今天就跟大家一起聊聊select...for update这个话题,希望对你会有所帮助。
1. 要什么要用行锁?
假如现在有这样一种业务场景:用户A给你转账了2000元,此时刚好,用户B也给你转账了3000元,而你的账户初始化金额是1000元。
用户A的请求,先查询出money,然后给money加上2000,在事务1中会执行下面这条sql:
update account set money=#{money}
where id=123;
同事,用户B的请求,也是先查询出money,然后给money加上3000,在事务2中执行下面这条sql:
update account set money=#{money}
where id=123;
这两条sql执行成功