0

由于临时重负​​载(大约 10 秒)导致反复死锁,我想将我们的数据库的隔离级别从 READ_COMMITED 更改为 READ_COMMITED_SNAPSHOT。

我试图尽可能多地阅读它,但有一件事我绝对不确定:这将如何影响触发器插入数据然后读取插入行的 ID?

这里有 2 种可能性(假设存在具有较低 ID 的行)并假设这 2 行在其他一些触发器内

1)

Insert into table (ID) value (3);
Select Top 1 ID from table order by ID desc;

2)

Insert into table (ID) value (3);
Select SCOPE_IDENTITY();

理论上这些应该没问题,但我想确认一下。谢谢

4

1 回答 1

2

使用Scope_Identity()OUTPUT子句来获取分配给新行的标识。它们不受 SELECT 允许的竞争条件的影响。隔离级别不应该出现问题。

OUTPUT出于各种原因,在您的工具包中拥有它是一件好事。它适用于INSERTDELETE和语句。它不限于单行。它确实允许捕获多个列,而不仅仅是一个标识值。UPDATEMERGE

不要使用@@IDENTITY,因为它从黑暗的一面获取价值。(除非您需要不可预测的值的来源。) IDENT_CURRENT()也很少有用。

于 2013-05-29T16:29:25.393 回答