首页 > 解决方案 > 在当前值上使用 where 子句的更新语句

问题描述

我正在尝试执行更新语句来更新我的数据库表中的余额。此表仅存储 userId 和 currentBalance。我正在将 mysql 与 InnoDB 一起使用。

我在想像这样的查询 -

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 再次执行整个语句而 where 子句返回 false,因为 WITHDRAW_AMOUNT+balance<0 现在?

标签: mysqlinnodbacid

解决方案


推荐阅读