SqlConnection在ADO.NET中自动创建事务

时间:2016-01-18 11:30:55

标签: c# sql-server stored-procedures transactions

最近我在商店程序中遇到了问题。我尝试了下面的代码进行测试,结果让我非常困惑。

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。

非常感谢。

0 个答案:

没有答案