Sql server SQLServer2008中的并发问题

Sql server SQLServer2008中的并发问题,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有两张表-主表和明细表。主表有一个ID列,它是主键和自动ID。我已经编写了一个SP将记录插入到这两个表中。在该SP中,当在主表中插入记录id时,将获取当前id并将其存储在一个变量中,然后将该变量传递给detail table insert以插入详细记录。当事务一个接一个地完成时,这是非常有效的。但是,当多个用户同时创建事务时,有时一个事务的详细记录会被插入另一个事务,这是一件危险的事情。请帮助我解决此问题。在这种情况下,我将使用SCOPE\u IDENTITY() 在这种情况下,我将使用范围标

我有两张表-主表和明细表。主表有一个ID列,它是主键和自动ID。我已经编写了一个SP将记录插入到这两个表中。在该SP中,当在主表中插入记录id时,将获取当前id并将其存储在一个变量中,然后将该变量传递给detail table insert以插入详细记录。当事务一个接一个地完成时,这是非常有效的。但是,当多个用户同时创建事务时,有时一个事务的详细记录会被插入另一个事务,这是一件危险的事情。请帮助我解决此问题。

在这种情况下,我将使用
SCOPE\u IDENTITY()


在这种情况下,我将使用
范围标识()


您的交易设置正确吗?您的SP应该如下所示

BEGIN TRAN

DECLARE @id INT

INSERT INTO Master (x, y , z) ...
SELECT @id = @@identity

INSERT INTO Child (id, foo, bar) VALUES (@id, ...

COMMIT TRAN
RETURN 0

:Err
ROLLBACK
RETURN 1

假设这是正确的,您需要检查服务器的默认隔离级别,以及执行存储过程的连接的隔离级别,但它更有可能是SP中的错误。您的事务设置是否正确?您的SP应该如下所示

BEGIN TRAN

DECLARE @id INT

INSERT INTO Master (x, y , z) ...
SELECT @id = @@identity

INSERT INTO Child (id, foo, bar) VALUES (@id, ...

COMMIT TRAN
RETURN 0

:Err
ROLLBACK
RETURN 1

假设这是正确的,您需要检查服务器的默认隔离级别,以及执行存储过程的连接的隔离级别,但它更可能是SP中的错误(返回插入到同一作用域的标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。)而不是@标识。

使用作用域\标识()(返回插入同一作用域中标识列的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。)而不是@@IDENTITY。

是否可以显示存储过程脚本?是否可以显示存储过程脚本?例如,如果表上的触发器插入另一个表,则IDENTITY
可能返回不正确的结果。如果表上的触发器插入另一个表,则Not@@IDENTITY可能返回不正确的结果对于另一个表,例如.Igor,非常感谢您提供这些信息。我使用了SCOPE_IDENTITY()替换当前的IDENTITY_并将其部署在live server上。我将需要等待数周时间才能知道此问题是否已解决。我们很少收到此错误,而且仅在live server上收到此错误。非常感谢您的输入。Igor,非常感谢此信息。我使用了SCOPE_IDENTITY()取代当前的Identin_并将其部署在live server上。我将需要等待数周时间才能知道此问题是否已得到解决。我们也很少在live server上收到此错误。非常感谢您的输入。这是正确的。它已起作用。非常感谢您的及时帮助这是正确的。它已起作用。比谢谢你的及时帮助