Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:如何避免在高并发性下对同一行进行多次更新_Sql Server_Azure_Concurrency_Sql Update - Fatal编程技术网

Sql server SQL Server:如何避免在高并发性下对同一行进行多次更新

Sql server SQL Server:如何避免在高并发性下对同一行进行多次更新,sql-server,azure,concurrency,sql-update,Sql Server,Azure,Concurrency,Sql Update,假设我有一个如下所示的库存阻塞机制 update inventory.items set status = 'BLOCKED' where id = (select top 1 id from inventory.items where status = 'AVAILABLE' order by id asc) 此代码在大多数工作负载中都能很好地工作。不过,我预计未来几天工作量将大幅增加。假设每秒有500次更新来自多

假设我有一个如下所示的库存阻塞机制

update inventory.items 
set status = 'BLOCKED'
where id = (select top 1 id 
            from inventory.items 
            where status = 'AVAILABLE'
            order by id asc)
此代码在大多数工作负载中都能很好地工作。不过,我预计未来几天工作量将大幅增加。假设每秒有500次更新来自多个web请求。我有一个ASP.NETCore2.2后端,提供数据访问。整个设置在一个Azure数据中心中

对于我的业务逻辑来说,一次以上的更新不会将同一行设置为
BLOCKED
,这一点至关重要。这将导致超过1个订单试图阻止一个单一的库存,其中最后一个赢得,其他人饿死

在这种情况下,最佳做法是什么。我应该让SQL Server处理负载吗?或者是否有一种方法可以锁定所选项目,以便在更新发生之前没有其他人可以读取它


提前感谢您的帮助

您可以向子查询添加
SERIALIZABLE
提示:
FROM inventory.items WITH(SERIALIZABLE)
。不要自己锁门。SS将始终释放锁。如果出现错误,代码可能会“永远”阻止记录。