我有一些客户端代码在一些表中提交一些数据,简单来说就是这样:
当客户购买资产时,我会执行以下伪代码:
BEGIN TRANSACTION
在步骤4中,使用函数' f_SumAssetsForClient'在1更新语句中更新客户端行。只是为客户总结资产并返回这些资产的余额。同样在第4步,时间戳会自动更新。
我的问题是,当我在第5步再次调用GetClientRow时,有人可能已经更新了客户端余额,所以当我在步骤6中写入日志时,在这组步骤之后它并不是真正的平衡。在此交易之外的不同写入之后,这将是余额。
如果我在步骤4中调用UPDATE时可以从客户端行获取新更新的时间戳,我可以将其传递给步骤以仅获取TS =新更新TS的客户端行。这有可能吗?或者我的设计存在缺陷。在第5步和第6步之间,我无法找到解决过时数据问题的方法。我觉得表设计中存在问题,但却无法完全看到它。
答案 0 :(得分:1)
从评论中复制
听起来你需要
SELECT f_SumAssetsForClient(1)
的步骤3.5 存储该值,然后执行更新,然后使用值写入日志 - 您 根本不应该处理时间戳 - 或者做整个过程 存储过程
答案 1 :(得分:1)
第1步需要FOR UPDATE
。需要更改的任何其他数据也需要“锁定”COMMITted
。
这样,另一个线程无法潜入并修改这些行。它们可能会延迟到你{{1}}之后,或者可能存在死锁。无论哪种方式,你担心的事情都不可能发生。没有时间戳游戏。