由于临时重负载(大约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();
理论上这些应该没问题,但我想确认一下。感谢
答案 0 :(得分:2)
使用Scope_Identity()或OUTPUT子句获取分配给新行的标识。它们不会受到SELECT允许的竞争条件的影响。隔离级别不应该是一个问题。
出于各种原因, OUTPUT
在您的工具包中是一件好事。它适用于INSERT
,DELETE
,UPDATE
和MERGE
语句。它不限于单行。它确实允许捕获多个列,而不仅仅是标识值。
不要使用@@IDENTITY
,因为它从黑暗面获取值。 (除非您需要不可预测值的来源。)IDENT_CURRENT()
也很少有用。