我正在尝试执行更新语句来更新数据库表中的余额。该表仅存储userId和currentBalance。 我在InnoDB中使用mysql。
我当时在想类似-
的查询update account a set a.BALANCE= a.BALANCE + WITHDRAW_AMOUNT where a.USER_ID = ?2 and a.BALANCE + WITHDRAW_AMOUNT > 0
此查询用于存入或提取资金(在提取的情况下,净余额不得低于0)
如果说我有一个ID为2的用户,那么他的当前余额为500。 共有2个请求要同时提款-
需求1-300
需求2-400
现在我在想,当使用where条件选择要更新的行时,会同时发生吗?据我所知,更新语句的执行确实获得了行上的锁。
如果是,则说Req1为ID为2的用户获取锁,而Req2进入等待这些行。然后我们的余额将更新为200。
现在余额为200,那么因为已选择了行,所以将执行Req 2,还是因为对Req 2再次执行了整个语句,而因为从WITHDRAW_AMOUNT + balance <0开始,where子句返回false,所以会执行? >