【问题标题】:Azure SQL concurrent inserts cause duplicates in incremented columnAzure SQL 并发插入导致增量列中的重复
【发布时间】:2019-12-17 12:59:58
【问题描述】:

我们将 PowerApps 与 Azure SQL 集成。用户提供的输入以增量行 ID 存储在 Azure SQL 中。请求 ID 递增操作在存储过程中处理。但是,如果多个用户同时添加内容,则所有请求都使用相同的请求 ID 保存。由于依赖关系,我们不能强制请求 ID 列是唯一的。

请建议我们是否可以在此处避免重复。这是 SP:

SELECT @ROWNUM = MAX(R.ROWNUM) + 1
         FROM REQUESTS R
         WHERE R.ABC = @XYZ

         IF @ROWNUM is NULL
         begin
             set @ROWNUM = 1
         end

         -- Inserting a single new request into request table with auto generated identify
            INSERT INTO REQUESTS
         (  
             Column1,
             …… 
             Columnn
         )

谢谢!

【问题讨论】:

  • 一种方法是在同一个可序列化事务中执行 SELECT 和 INSERT。考虑增加死锁的可能性。
  • 这不是一个自动递增的列。这是手动递增的 MAX+1,即使只有两个命令在 本地 服务器上同时运行,也容易出现重复。请改用 IDENTITY 或 SEQUENCE。如果要返回新 ID,请使用 INSERT 中的 OUTPUT 子句
  • 即使使用 one 用户也容易出现重复 - 如果您删除最新的行,此查询将再次生成相同的 ID。如果这些值在其他表中使用,例如作为查找键,它们最终会在不相关的行之间创建虚假关系
  • @PanagiotisKanavos 问题是 Rownum 不能更改为身份...rownum 是请求 ID ..我有一个叫做检查的东西(如果你愿意的话,一个父级),每个检查可以有多个请求。 .在每次检查中,requestID 必须从 1 开始并递增。有什么建议吗?
  • the requestID has to start at 1 and get incremented. 这意味着它不是一个ID,只是一个计数器?即使它是一个业务字段,例如发票编号或订单中的行项目,它仍然是一个计数器。您可以去掉该列并在查询时计算ROW_NUMBER(),按行的键排序。

标签: sql sql-server azure-sql-server


【解决方案1】:

为了避免这种情况,您可以将表列 ROWNUM 更改为标识

CREATE TABLE [dbo].[REQUESTS](
    [ROWNUM] [int] IDENTITY(1,1) NOT NULL,
    [Col1] [int] NOT NULL,
    [Col2] [varchar](50) NOT NULL,
    [Col3] [datetime] NOT NULL,
 CONSTRAINT [PK_REQUESTS] PRIMARY KEY CLUSTERED 
(
    [ROWNUM] ASC
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2010-10-11
    相关资源
    最近更新 更多