我以为我很好地掌握了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
似乎有一个完全不同的值。我是否患有代码失明?还是有一些我不熟悉的行为?