【问题标题】:Insert data concurrently, whereas the new row should be computed based on last inserted row同时插入数据,而新行应根据最后插入的行计算
【发布时间】:2020-01-18 14:47:13
【问题描述】:

我正在开发一个系统,该系统根据用户在交易上花费的金额给予积分

每当客户执行交易时,一条消息将被推送到 sqs 并触发一个 lambda(.net core,Ef core,postgresql)检查该客户的积分表中是否存在积分,如果是,则计算新积分基于最后收到的积分并插入另一行,因为我们需要维护积分历史。但是,当用户同时执行多个事务时,积分计算不正确。

积分表

用户id 点前点后点接收到的事务id 1 0 10 10 1 1 10 20 10 2 1 20 30 10 3 1 20 30 10 4

事务 id 3&4 -> 同时发生。

我尝试了各种隔离级别,例如已提交读和可序列化。但不工作。

谁能帮我解决这个问题。

【问题讨论】:

  • 您的示例存在一些格式问题,使其难以理解。可以重新格式化吗?

标签: database postgresql concurrency aws-lambda isolation-level


【解决方案1】:

如果你使用可序列化的隔离级别,那么当系统检测到异常时,一个事务会得到一个序列化错误,并且必须回滚并重试。

或者您可以在应用程序中设置编码规则,任何计划可能插入积分记录的人必须在读取或插入积分之前锁定客户记录(“SELECT...FOR UPDATE”)。

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多