如何锁定SQL Server中尚不存在的特定行

我有一个管理我们应用程序的API速率限制表。 这是它的定义。

CREATE TABLE [dbo].[RateLimit]
(
    [UserId] [int] NOT NULL,
    [EndPointId] [smallint] NOT NULL,
    [AllowedRequests] [smallint] NOT NULL,
    [ResetDateUtc] [datetime2](0) NOT NULL,

    CONSTRAINT [PK_RateLimit] 
        PRIMARY KEY CLUSTERED ([UserId] ASC, [EndPointId] ASC)
) ON [PRIMARY]

在这个表格上执行CRUD操作的过程是多线程的,因此需要仔细考虑这张表格,这个表格用作速率限制检查的转移(即,我们是否超出了我们的速率限制,我们是否可以提出另一个请求,等等。)

我试图引入SQL锁来使应用程序能够可靠地插入,更新和选择值,而不需要从它下面更改值。 除了这种正常的复杂性之外,最大的RateLimit在于UserId + EndPointId的RateLimit记录可能不存在 - 并且需要创建。

在这里输入图像描述

我一直在研究SQL锁,但问题是如果速率限制记录尚不存在(即第一次运行),可能没有锁定行。

我想过创建一个专门用于控制锁定流量的临时表 - 但我不确定这将如何工作。

在最远的极端,我可以将SQL语句包装在SERIALIZABLE事务中(或者某种程度上),但是锁定整个表会对性能产生巨大影响 - 我只关心userid + endpointid主键,并确保特定行被一次读取+更新/插入。

我该如何处理这种情况?

版本:SQL Server 2016

注意:READ_COMMITTED_SNAPSHOT已启用

链接地址: http://www.djcxy.com/p/5607.html

上一篇: How to lock a specific row that doesn't exist yet in SQL Server

下一篇: Standard error calculation using Crossfilter reductio plugin?