gpt4 book ai didi

c# - Entity Framework 自动增量键

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:04 24 4
gpt4 key购买 nike

我在并发场景中遇到了重复增量字段的问题。

我正在使用 EF 作为 ORM 工具,试图插入一个实体,该实体的字段充当增量 INT 字段。基本上这个字段称为“SequenceNumber”,其中插入之前的每个新记录都将使用 MAX 读取数据库以获取最后一个 SequenceNumber,向其附加 +1,并保存更改。

在获取最后一个 SequenceNumber 和保存之间,这就是并发发生的地方。

我没有将 ID 用于 SequenceNumber,因为它不是唯一约束,并且可能会在某些条件下重新设置,例如每月、每年等。

InvoiceNumber       | SequenceNumber | DateCreated
INV00001_08_14 | 1 | 25/08/2014
INV00001_08_14 | 1 | 25/08/2014 <= (concurrency is creating two SeqNo 1)
INV00002_08_14 | 2 | 25/08/2014
INV00003_08_14 | 3 | 26/08/2014
INV00004_08_14 | 4 | 27/08/2014
INV00005_08_14 | 5 | 29/08/2014
INV00001_09_14 | 1 | 01/09/2014 <= (sequence number reset)

发票编号根据 SequenceNumber 进行格式化。

经过一些研究,我得出了这些可能的解决方案,但想知道最佳实践

  1. 悲观并发,在当前事务完成之前锁定表以防止任何读取(不喜欢这个想法,因为我认为性能会产生很大影响?)

  2. 专门为此目的创建一个存储过程,并在单个语句上进行选择和插入,因为这样的并发性最低(如果可能,更喜欢基于 EF 的方法)

==============================

编辑

我想到的另一个解决方案是使 InvoiceNumber 成为 Unique Constraint,因此在重复条目的情况下它会抛出 Unique Constraint Violation 错误, catch 它,并重新尝试获取新的 SequenceNumber 和 InvoiceNumber 以重新插入到数据库中。

最佳答案

使用带有身份 key 的假表/实体。

在插入发票之前,先在假表中插入以获得 ID。使用 ID,不是作为 FK,而是作为 SequenceNumber

对于重置:截断假表。

可预见的问题:序列中可能存在空洞,具体取决于插入错误。

注意CREATE SEQUENCE自 sql server 2012 以来。顺便说一句,如果你觉得这个想法不错,也可以 upvote on datavoice

=====

一个sql序列可以通过约束作为默认值:

ALTER TABLE Invoice
ADD CONSTRAINT DefSequence DEFAULT (NEXT VALUE FOR InvoiceSeq)
FOR SequenceNumber;
GO

通过将 SequenceNumber 设置为 DatabaseGeneratedOption.Computed 它可能是完美的。

关于c# - Entity Framework 自动增量键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25489369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com