MySQL更新返回成功但更新没有发生

时间:2021-03-08 13:42:36

标签: mysql spring hibernate

我有一个 spring/hibername/mysql 项目。其中一个事务更新了用户表中的用户余额,并在 trx_log 表中插入了包含前后余额的日志,并且大部分时间都可以正常工作。为了保证来自用户的最后一个余额是在日志中使用的余额,我选择更新(我在负载均衡器后面有多个服务器,它需要这样做以避免在收到用户的多个事务时并发读取同一用户的问题同一时间)。这是服务事务中的两个查询:

  1. UPDATE User u SET u." + User_.balance.getName() + " = u." + User_.balance.getName()+ " + :addition" + ", u." + User_. expiringBalance.getName() + " = u." + User_.expiringBalance.getName() + " +:addition ";

  2. StringBuilder sqlStmt = new StringBuilder("INSERT INTO trx_log ") .append("(CREATE_DATE, Gain_balance, user_before_balance, user_after_balance, user_id, event_name,") .append("(选择 now(), :gained_balance, u.balance, u.balance+:gained_balance, :userId, :event_name,") .append(" from app_users u where u.id=:userId for update ) ");

问题是,有时当两个语句都执行时,都返回成功并且从 executeUpdate 方法返回的受影响的行数为 1。但是,我可以看到 trx 日志,但没有发生更新导致错误值(留在那里的旧价值)。这不是正常情况。我还尝试将列从 double 更改为 numeric(以及 Java 中的 BigDecimal),但每天仍会发生几次相同的问题。是否有更新会返回成功但实际上不更新记录的原因?导致 trx_log 看起来正确但余额不正确?

提前致谢。

0 个答案:

没有答案
相关问题