gpt4 book ai didi

mysql - 如何在更新后立即获取时间戳值?

转载 作者:行者123 更新时间:2023-11-29 06:04:59 25 4
gpt4 key购买 nike

我有一些客户端代码在一些表中提交一些数据,简单来说如下:

  • 客户端 [Id、余额、时间戳]
  • ClientAssets [Id, AssetId, Quantity]
  • ClientLog [Id, ClientId, BalanceBefore, BalanceAfter]

当客户购买 Assets 时,我执行以下伪代码:

开始交易

  1. GetClientRow,其中 ID = 1
  2. 有足够的余额支付新 Assets 成本吗?是的……
  3. 插入 ClientAssets...
  4. UpdateClient -> UPDATE Client SET Balance = f_SumAssetsForClient(1) WHERE ID = 1 and Timestamp = TS 来自第 1 步;
  5. GetClientRow,其中 ID = 1
  6. 插入 ClientLog BalanceBefore = 步骤 1 的余额,BalanceAfter = 步骤 5 的余额。提交

在第 4 步中,使用函数“f_SumAssetsForClient”在 1 个更新语句中更新客户行,该函数仅对客户的 Assets 求和并返回这些 Assets 的余额。同样在第 4 步,时间戳会自动更新。

我的问题是,当我在第 5 步再次调用 GetClientRow 时,可能有人更新了客户余额,所以当我在第 6 步中写入日志时,这并不是真正的这组步骤后的余额。这将是在此交易之外进行不同写入后的余额。

如果在步骤 4 中调用 UPDATE 时我可以从客户端行获取新更新的时间戳,我可以将其传递给步骤以仅获取 TS = 新更新的 TS 的客户端行。这可能吗?或者是我的设计有缺陷。我看不出有什么办法可以解决第 5 步和第 6 步之间的陈旧数据问题。我感觉到表设计存在问题,但不太清楚。

最佳答案

第 1 步需要SELECT ... FOR UPDATE。任何其他需要更改的数据也需要“锁定”FOR UPDATE

这样,另一个线程就不能潜入并修改这些行。它们可能会延迟到您COMMITted 之后,否则可能会出现死锁。无论哪种方式,您担心的事情都不会发生。没有时间戳游戏。

关于mysql - 如何在更新后立即获取时间戳值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42290867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com