如何锁定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?