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

时间:2017-02-17 06:28:26

标签: mysql sql database-design

我有一些客户端代码在一些表中提交一些数据,简单来说就是这样:

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

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

BEGIN TRANSACTION

  1. GetClientRow ID = 1
  2. 新资产成本有足够的余额吗?是的......
  3. 插入ClientAssets ...
  4. UpdateClient - > UPDATE客户端SET Balance = f_SumAssetsForClient(1)WHERE ID = 1且Timestamp = TS来自步骤1;
  5. GetClientRow ID = 1
  6. 插入ClientLog BalanceBefore =步骤1的余额,BalanceAfter =步骤5的余额。 COMMIT
  7. 在步骤4中,使用函数' f_SumAssetsForClient'在1更新语句中更新客户端行。只是为客户总结资产并返回这些资产的余额。同样在第4步,时间戳会自动更新。

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

    如果我在步骤4中调用UPDATE时可以从客户端行获取新更新的时间戳,我可以将其传递给步骤以仅获取TS =新更新TS的客户端行。这有可能吗?或者我的设计存在缺陷。在第5步和第6步之间,我无法找到解决过时数据问题的方法。我觉得表设计中存在问题,但却无法完全看到它。

2 个答案:

答案 0 :(得分:1)

从评论中复制

  

听起来你需要SELECT f_SumAssetsForClient(1)的步骤3.5   存储该值,然后执行更新,然后使用值写入日志 - 您   根本不应该处理时间戳 - 或者做整个过程   存储过程

答案 1 :(得分:1)

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

这样,另一个线程无法潜入并修改这些行。它们可能会延迟到你{{1}}之后,或者可能存在死锁。无论哪种方式,你担心的事情都不可能发生。没有时间戳游戏。