SqlCommand并发执行时SCOPE_IDENTITY()作用域规则咨询
解答
SCOPE_IDENTITY() 只会返回当前SqlCommand执行批次内、同作用域生成的最新标识值,完全不会拿到其他并发运行的SqlCommand生成的标识值,每个独立启动的SqlCommand执行批次都对应隔离的独立作用域,具体逻辑:
- 首先明确
SCOPE_IDENTITY()的生效边界:它只在当前会话、当前作用域内返回值。这里的会话对应C#代码里单个打开的SqlConnection实例,不同SqlConnection在SQL Server端是完全独立的会话,会话之间的所有运行状态完全隔离,根本不可能互相读取到对方生成的标识值;作用域指的是单个批处理语句、存储过程、触发器这类独立执行的代码模块,不同模块之间的作用域也互不干扰。 - 你现在的并发执行场景下,每次跑这段代码都会新建一个全新的SqlConnection,和其他同时运行的同逻辑代码创建的连接完全隔离,哪怕执行时间完全重叠,各自的
SCOPE_IDENTITY()也只会读取自己当前批次插入生成的标识值,不会串到其他请求的结果。 - 你现在把两条INSERT语句写在同一个SqlCommand的query文本里,属于同一个执行批次、同一个作用域,第二条插入prices表语句里的
SCOPE_IDENTITY(),会准确拿到第一条插入products表生成的自增ID,不会出问题。
补充提醒:别和
@@IDENTITY搞混,@@IDENTITY虽然也限定在当前会话,但会穿透触发器这类嵌套作用域返回值,而SCOPE_IDENTITY()只会返回你当前直接执行的代码块里生成的标识值,是这类连续插入场景下取自增值最可靠的选择。
- 就算你在同一个SqlConnection上开启MARS(多活动结果集)同时跑多个SqlCommand,每个SqlCommand对应的执行批次依然有独立的作用域,
SCOPE_IDENTITY()不会跨批次返回值。
内容的提问来源于stack exchange,提问作者Sarcovitz
相关产品推荐
相关产品推荐

