在没有竞争条件的SQL Server中使用Identity

时间:2016-10-19 18:43:08

标签: sql sql-server

因此,我们假设您有一张患有主键IDENTITY(1,1)的患者表。通过使用@@ Identity,我们如何避免两个人同时挽救新患者的竞争状况?显然,不会创建Patient表中的重复ID,但是如果应用程序需要其中一个插入的患者的ID来更新另一个表中的记录,该怎么办?我们怎么知道如果同时插入了@@ Identity,那么@@ Identity不会获得另一条记录的ID?

或者是否有避免这种情况的最佳做法?

JamesNT

2 个答案:

答案 0 :(得分:2)

是的,有最好的做法。请勿使用insert

获取OUTPUT语句中分配的标识值的最安全方法是使用{{1}}子句。您应该从documentation开始。

这有很多好处:

  • 它不会被触发器和嵌套语句搞糊涂。
  • 它可以同时处理多个插入。
  • 它可以返回其他列的值,而不仅仅是标识列。
  • 它专门返回受交易影响的行,因此您甚至不会考虑会话,用户或其他任何内容。

答案 1 :(得分:1)

@@ IDENTITY不会导致竞争条件,但这也不是最佳做法。您应该使用SCOPE_IDENTITY。

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/