SQL Server @@ trancount混淆

时间:2017-09-07 22:32:03

标签: sql-server

我以为我很好地掌握了SQL Server事务行为和@@trancount的预期返回值。

为了在从Entity Framework调用存储过程时测试自动事务创建,我创建了以下测试场景,这让我质疑我的基础知识。

这是设置

CREATE TABLE mutation
(
    k int
    v varchar(30)
)
go

CREATE PROCEDURE getTranDepth
AS
    print convert(varchar,@@TRANCOUNT) + ' entry value'
    select @@TRANCOUNT

    print convert(varchar, @@TRANCOUNT) + ' entry post read'

    update mutation
    set v = convert(varchar, getdate())
    where k = @@TRANCOUNT

    print convert(varchar, @@TRANCOUNT) + ' post update'

    select @@trancount, convert(varchar, getdate())
    where not exists (select 1 from mutation where k = @@TRANCOUNT)

    print convert(varchar, @@TRANCOUNT) + ' post fake insert'

    insert mutation(k, v)

    select @@trancount, convert(varchar, getdate())
    where not exists (select 1 from mutation where k = @@TRANCOUNT)

    print convert(varchar, @@TRANCOUNT) + ' post insert'

你看到我为了解我所看到的奇怪而添加的印刷语句。

但后来我又遇到了一些奇怪的事情,我希望有人可以帮助我(理解)

如果我运行以下陈述

select * from mutation 

exec getTranDepth

select * from mutation 

select @@VERSION

我得到以下结果(我将所有输出转移到文本以便更容易看到响应时间)

k,v

(0 row(s) affected)

0 entry value

0

(1 row(s) affected)

0 entry post read

(0 row(s) affected)
0 post update
,
0,Sep  7 2017  3:56PM

(1 row(s) affected)

0 post fake insert

(1 row(s) affected)
0 post insert
k,v
2,Sep  7 2017  3:56PM

(1 row(s) affected)


Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 
    Jun 17 2016 19:14:09 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
(1 row(s) affected)

所以基本上这是按照我预期的@@trancount打印值执行的。但是当它更新时,表@@trancount似乎有一个完全不同的值。我是否患有代码失明?还是有一些我不熟悉的行为?

0 个答案:

没有答案