存储过程中的 TSQL 互斥访问过程中、互斥、TSQL

2023-09-07 16:14:21 作者:没感情就绝交吧。

多个网络服务器访问 SQL Server 以获取数字代码,当此代码不存在时,它必须由 SQL Server 自动生成.

我需要确保即使有两个并发调用进来并且代码不存在,也只会创建一个代码并且两个调用都返回相同的代码.所以我必须这样做:

开始锁定如果代码存在返回码别的生成代码返回码端锁
操作系统之认识进程

我已经阅读了一些关于隔离级别和表锁定的内容,但我对所有这些都感到非常混乱.首先,我认为 SERIALIZABLE 隔离级别是我需要的,但显然不是.

那么,您将如何在 TSQL 中完成锁定"?

非常感谢.

更新:

当我尝试使用 this 为例:

设置 ANSI_NULLS ON去设置 QUOTED_IDENTIFIER ON去更改程序 get_code作为开始设置事务隔离级别可序列化去开始交易从授权为空的代码中选择代码;结尾去

消息 1018,级别 15,状态 1,程序get_code,第 4 行附近的语法不正确可序列化".如果这是为了表提示的一部分,一个 WITH 关键字现在需要括号.看SQL Server 联机丛书句法.消息 102,级别 15,状态 1,第 5 行 'END' 附近的语法不正确.

什么意思?

解决方案

SERIALIZABLE 是锁定的隔离级别,而不是 信号量.

在这种情况下它不会起作用,你要做的就是在 TXN 的末尾保持一个读取锁,这不会阻止另一个进程读取代码.

您需要在事务模式下使用 sp_getapplock.您可以将其配置为等待、立即轰炸等:由您决定

这是基于我的模板来自 嵌套存储包含 TRY CATCH ROLLBACK 模式的程序?

ALTER PROCEDURE get_code作为SET XACT_ABORT,NOCOUNT ON声明@starttrancount int,@result int;开始尝试选择@starttrancount = @@TRANCOUNTIF @starttrancount = 0 开始交易EXEC @result = sp_getapplock 'get_code', 'Exclusive', 'Transaction', 0如果@结果