首页 > 解决方案 > 如果插入依赖于先前的记录,如何处理对数据库的并发插入?

问题描述

我正在设计一种小型银行系统(会有“信用”,而不是真钱)。如果用户有新交易,我想要一种 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。

标签: postgresqlconcurrencytransactionsef-core-2.2

解决方案



推荐阅读