SQL Server READ_COMMITED_SNAPSHOT触发器内部

时间:2013-05-29 15:03:45

标签: sql-server locking

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

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

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

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();

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

1 个答案:

答案 0 :(得分:2)

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

出于各种原因,

OUTPUT在您的工具包中是一件好事。它适用于INSERTDELETEUPDATEMERGE语句。它不限于单行。它确实允许捕获多个列,而不仅仅是标识值。

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