zoukankan      html  css  js  c++  java
  • IDENTITY、SCOPE_IDENTITY、IDENT_CURRENT的分析

    https://www.cnblogs.com/daihuiquan/archive/2013/03/18/2956845.html

    IDENT_CURRENT、IDENTITY、SCOPE_IDENTITY区别

    概念解释

    • IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.

    • IDENTITY returns the last identity value generated for any table in the current session, across all scopes.

    • SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.

    查找到有中文解释,但还是发现用英文解释,更容易理解。

    IDENT_CURRENT,为指定表的所有会话和所有作用域生成的最后一个标识值;
    IDENTITY,为当前会话的所有表和所有作用域的最后一个标识值;
    SCOPE_IDENTITY,当前会话和当前作用域的所有表的最后一个标识值;

    SQL说明

    复制代码
    CREATE TABLE Test1(id int IDENTITY);
    CREATE TABLE Test2(id int IDENTITY(100,1));
    GO
    CREATE TRIGGER Test1ins ON Test1 FOR INSERT 
    AS
    BEGIN
       INSERT Test2 DEFAULT VALUES
    END;
    GO
    --End of trigger definition
    
    SELECT id FROM Test1;
    --IDs empty.
    SELECT id FROM Test2;
    --ID is empty.
    
    --Do the following in Session 1
    INSERT Test1 DEFAULT VALUES;
    SELECT @@IDENTITY;
    /*Returns the value 100. This was inserted by the trigger.*/
    
    SELECT SCOPE_IDENTITY();
    /* Returns the value 1. This was inserted by the 
    INSERT statement two statements before this query.*/
    
    SELECT IDENT_CURRENT('Test2');
    /* Returns value inserted into Test2, that is in the trigger.*/
    
    SELECT IDENT_CURRENT('Test1');
    /* Returns value inserted into Test1. This was the INSERT statement four statements before this query.*/
    复制代码

    所有在执行insert 表A、B、C的事务时候,取IDENT_CURRENT("A")的时候,又没有及时将此ident插入相应记录D,而这个记录表D又要求插入的ident有唯一索引。这时就可能出现唯一索引重复插入失败,因为,在执行事务的时候其它会话,可能已经将此ident插入记录表D。所以这时候用SCOPE_IDENTITY更稳健一点。

    补充

     

    session和scope 在博客园找到的概念是这样的:

    一个作用域 就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

    会话 一个用户连接产生的所有上下文信息。一个查询分析器窗口就是一个会话

    但是一个用户connection代表一个session,这个好像不对。

    A connection represents the external connection to the server (over a network or locally through shared memory for example).
    A session represents a user process within SQL Server.
    A connection may be associated with zero, one, or many sessions.

    Take a look at the columns on sys.dm_exec_connections and sys.dm_exec_sessions. That should give you a feel for the differences.

     sys.dm_exec_connections http://msdn.microsoft.com/zh-cn/library/ms181509.aspx 

    sys.dm_exec_sessions  http://msdn.microsoft.com/zh-cn/library/ms176013.aspx

      

  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/10950119.html
Copyright © 2011-2022 走看看