【发布时间】:2019-08-28 06:10:04
【问题描述】:
我正在设计一种小型银行系统(会有“信用”,而不是真钱)。如果用户有新的交易,我想要一种 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。
【问题讨论】:
标签: postgresql concurrency transactions ef-core-2.2