最近我在商店程序中遇到了问题。我尝试了下面的代码进行测试,结果让我非常困惑。
CREATE PROC proc_TranTest
AS
BEGIN
--record initial TranCount
INSERT INTO [DebugLog]([Action], [ExtralInfo], [LogTime])
VALUES('tran', 'after begin:' + STR(@@TRANCOUNT), GETDATE())
SET XACT_ABORT ON
BEGIN TRANSACTION
--now we begin a new tran
INSERT INTO [DebugLog]([Action], [ExtralInfo], [LogTime])
VALUES('tran', 'after tran begin:' + STR(@@TRANCOUNT), GETDATE())
COMMIT TRANSACTION
--record trancount after our tran is committed
INSERT INTO [DebugLog]([Action], [ExtralInfo], [LogTime])
VALUES('tran', 'after tran commit:' + STR(@@TRANCOUNT), GETDATE())
RETURN 1
END
我们可以看到,我只是在不同时间记录价值或@@ TRANCOUNT。
首先,我刚使用EXEC [proc_TranTest]
,结果完全正常:0-1-0,
然后我尝试从C#代码调用该过程,使用sqlconnection,结果是2-3-2。这对我来说很奇怪!我没有在程序中使用任何事务,所以交易来自哪里?
然后我在sqlconnection中使用了sqltransaction,结果仍然是2-3-2。
我已经搜索了很长时间并阅读了很多相关的文章,但是我没有找到关于这种情况的任何说明(好吧,有一个类似的question,但嵌套的trans用于那个问题,而我没有在这里使用它。) msdn中的正式文件也没有给我很多帮助。
所以,我的问题是,当我使用C#代码连接数据库并调用sp时,为什么@@ TRANCOUNT为2?不应该是0(没有sqltrans)或1(使用sqltrans)?是ADO.NET还是db在连接开始时自动创建事务?或者有什么东西可以配置来做那些我没有注意到的事情吗?
顺便说一句,我在vs2013中使用了.net 4.0,在sql server 2008中使用了r2。
非常感谢。