【发布时间】:2011-06-14 11:23:45
【问题描述】:
多个网络服务器访问 SQL Server 以获取数字代码,当此代码不存在时,它必须由 SQL Server 自动生成。
我需要确保即使有两个并发调用进来并且代码不存在,也只会创建一个代码并且两个调用都返回相同的代码。所以我必须这样做:
begin lock
if code exists
return code
else
generate code
return code
end lock
我一直在阅读有关隔离级别和表锁定的一些内容,但我对所有这些都感到非常混乱。首先我认为 SERIALIZABLE 隔离级别是我需要的,但显然不是。
那么,您将如何在 TSQL 中完成“锁定”?
非常感谢。
更新:
当我尝试使用this 设置可序列化级别时遇到此错误:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE get_code
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
select code from codes where granted is null;
END
GO
消息 1018,级别 15,状态 1,程序 get_code,第 4 行附近的语法不正确 “可序列化”。如果这是为了 表提示的一部分,一个 WITH 关键字 现在需要括号。看 SQL Server 联机丛书 句法。消息 102,级别 15,状态 1, 第 5 行 'END' 附近的语法不正确。
什么意思?
【问题讨论】:
-
如何知道代码是否已经存在?
-
该死的!我还没有发现该关键字的用处:D
-
直到今天,我仍然不知道 GO 是干什么用的。承诺,是的。但不是GO。我认为这是 Microsoft 的另一个蹩脚功能。
标签: sql-server multithreading sql-server-2005 synchronization locking