【发布时间】:2021-10-05 08:27:53
【问题描述】:
我有一个无法找到确切答案/理解的场景。考虑有一个IAccountService,它有方法GenerateUniqueAccountNumber。有一个几分钟的窗口(假设是 10 分钟),很多用户(可能在 6K - 8K 左右) 将调用此方法来生成他们的帐号.此方法将根据计数器值返回一个新数字,该数字在 db 中维护。意思是,它将:
- 从 db 获取最新发布的帐号,作为计数器维护。 (例如 1000)
- 加一。 (例如 1001)
- 将号码分配给呼叫者的帐户并保存。 (一些业务逻辑)
- 将计数器值(最新发布的号码)设置为 1001。以便下一个调用者获得 1002。
我的问题是,如何保证帐号的唯一性?我预计会有一些并发调用。那么创建一个单独的服务IAccountNumberManager 并在其中移动GenerateUniqueAccountNumber 方法是个好主意。然后将此服务注册为AddSingletonlifetime?在这种情况下,将其注册为Singleton 会有什么不同吗?
或
我应该在IAccountService 内的相关代码中应用lock,以保证并发请求得到正确/有序的帐号?
或
我应该两者都做?意思是,创建IAccountNumberManager,注册为AddSingleton生命周期,也申请lock?
我们将不胜感激。
【问题讨论】:
-
最好保证数据库端的唯一性。也就是说,数据库应该为您提供一个值并增加它,而不是您的代码。
-
自动增量会很有用
-
@Evk 不,因为这只是一个例子。实际上,我要做的不仅仅是增加数字。这就是为什么我明确指定了我的问题。
-
除非您要求没有间隙(例如帐号 1 后跟 3,中间没有 2) - 您可以同时从数据库中获取和增加值,然后用它执行业务逻辑。
标签: c# asynchronous .net-core dependency-injection concurrency