我有两个表:缺陷和缺陷数据.每个缺陷可能有也可能没有一个或多个缺陷数据.因此,DefectData将DefectId列作为外键.
两个表中的Id都是自动递增的标识.
我遇到的问题是,当我想插入一个新的缺陷及其缺陷数据时,首先插入缺陷并获取一个Id,但我不知道该ID是给DefectData的.我的解决方案是从匹配插入数据的缺陷中选择以获得Id.
设置IdentityInsert然后插入我自己的Id将无法工作,因为这是由网络服务器运行,可能有并发呼叫(我在这里吗?).

提前致谢.
sql insert foreign-key-relationship identity-column sql-server-2008
多个Web服务器访问SQL Server以获取数字代码,当此代码不存在时,它必须由SQL Server自动生成.
我需要确保即使两个并发调用进入并且代码不存在,也只创建一个代码,并且两个调用都返回相同的代码.所以我必须做这样的事情:
begin lock
if code exists
return code
else
generate code
return code
end lock
Run Code Online (Sandbox Code Playgroud)
我一直在阅读关于隔离级别和表锁定的一些内容,但我对这一切都很糟糕.首先,我认为SERIALIZABLE隔离级别是我需要的,但显然它不是.
那么,你将如何在TSQL中实现"锁定"?
非常感谢.
更新:
当我尝试使用此示例设置可序列化级别时出现此错误:
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
Run Code Online (Sandbox Code Playgroud)
消息1018,级别15,状态1,过程get_code,第4行'SERIALIZABLE'附近的语法不正确.如果这是作为表提示的一部分,则现在需要A WITH关键字和括号.有关正确的语法,请参阅SQL Server联机丛书.消息102,级别15,状态1,行5'END'附近的语法不正确.
这是什么意思?
sql-server multithreading synchronization locking sql-server-2005
我有一个存储过程PROC,它接收一些参数.如果其中一个@ID不是null PROC_A,则必须执行给定的存储过程.否则,PROC_B必须执行.问题是它们都可以发出一个RAISERROR,我希望通过调用堆栈传播,以便在客户端应用程序中显示.但是,这RAISERROR不会停止PROC存储过程的其余部分,因为我使用的是IF子句,因此检查IF ( @@ERROR <> 0 ) RETURN也不是一种选择.我唯一的选择似乎是使用一个TRY...CATCH块来包装IF子句并RAISERROR从CATCH块中重新抛出from ,这很麻烦因为那时我将不得不缓存ERROR_MESSAGE(),ERROR_SEVERITY()并 再次ERROR_STATE()使用RAISERROR.
真的没有更优雅的方式吗?
我使用INSERT和SELECT在表中插入一个或多个行.在事务之后,我想将@@ ROWCOUNT和@@ ERROR值存储到locallay声明的变量中.
INSERT SubscriberList (PublicationId, SubscriberId)
SELECT @PublicationId, S.SubscriberId
FROM Subscribers S
SET @NoRows = @@ROWCOUNT
SET @ErrorCode = @@ERROR
Run Code Online (Sandbox Code Playgroud)
如果我打电话给我,我不确定这是否有效,我会否定另一个吗?
我需要使用RAISERROR来抛出一条消息(弹出消息)并提交该事务.有什么选择吗?
对于严重性18,事务得到了回滚.我已将严重性更改为10并尝试了
RAISERROR('Your Reference Number is %s',10,0,@param);
Run Code Online (Sandbox Code Playgroud)
这但它提交了交易,但没有显示消息.我需要的是必须抛出消息并且必须提交事务
有什么建议吗?