postgresql - 如果插入依赖于先前的记录,如何处理对数据库的并发插入?
问题描述
我正在设计一种小型银行系统(会有“信用”,而不是真钱)。如果用户有新交易,我想要一种 TransactionLog 表来获取记录,但我需要此记录必须包含字段“CreditsBefore”和“CreditsAfter”。
考虑情况:
UserId | Transaction | CreditsBefore | CreditsAfter
1 | +20 | 0 | 20
1 | +5 | 20 | 25
假设用户“1”有 2 笔新交易。预期结果是:
UserId | Transaction | CreditsBefore | CreditsAfter
1 | +20 | 0 | 20
1 | +5 | 20 | 25
1 | +10 | 25 | 35
1 | +100 | 35 | 135
但如果它们将并行执行,我们最终可能会得到:
UserId | Transaction | CreditsBefore | CreditsAfter
1 | +20 | 0 | 20
1 | +5 | 20 | 25
1 | +10 | 25 | 35
1 | +100 | 25 [bug] | 125 [bug]
我知道我可以使用表锁,但是我不想锁定整个表(它可能包含数百万条记录,用于数千个用户)。
是否可以以某种方式锁定表仅用于“ID 为 1 的用户的所有记录”?或者是否有任何其他模式来处理上述情况?
我正在使用 EF Core 和 PostgreSQL。
解决方案
推荐阅读
- go - Goroutine 存储通道值没有死锁
- java - 比较两个字符串并找出多余的字符
- kubernetes - istio 允许在没有任何服务条目的情况下连接到 HTTPS url
- python - 使用 ElementTree 解析 Python XML:findall 返回空列表
- c# - 在 OLEDBCommand 查询上打开 Excel 工作表
- javascript - 为什么我的反向数组函数的输出与输入相同?
- javascript - 纽约市报道用 babel mocha 为空
- java - Guice - 如何制作一个没有 args 构造函数单例的类并让变量自动注入?
- kotlin - Kotlin,执行嵌套可空性检查时调用了不正确的 Elvis 语句
- python - 如何将图像划分为 8x8 块并使用 opencv 将它们合并回来?