失败的TransactionScope仍在完成

时间:2018-04-12 12:55:48

标签: c# sql sql-server transactions transactionscope

很长一段时间我在使用TransactionScope时都使用了以下结构。

using(var con = new SqlConnection(CONNECTIONSTRING))
{
    con.Open();
    foreach(var file in files)
    {
        try
        {           
            using(var tran = new TransactionScope())
            {
                using(var cmd = new SqlCommand(CMDTEXT1, con)
                {
                    //add parameters
                    //ExecuteScalar or ExecuteNonQuery 
                }
                //...repeat above as needed for other inserts
                //...run other C# methods like FTP upload
                tran.Complete();
            }
        }
        catch(Exception ex)
        {
            //log exception
        }
    }
}

今天,我的FTP服务器已关闭,但我的SQL服务器已启动。错误被正确捕获并且tran.Complete从未运行。我希望tran能够回滚更改,但它已经插入了我的所有命令

这是因为SqlConnection不在TransactionScope范围内吗?我是否必须为每笔交易开始new SqlConnection我希望保留此结构,以便我可以重复使用SqlConnection,因此我考虑将new TransactionScope替换为con.BeginTransaction但我读到它不允许混合C#(我需要运行C#方法,如FTPUpload)。 我是否误解了这个?

通过评论回答

这是因为SqlConnection不在TransactionScope范围内吗?的

我是否必须为每笔交易开始new SqlConnection?的

我是否误解了这个? 我将EntityFramework.BeginTransactionSqlConnection.BeginTransaction混为一谈。

0 个答案:

没有答案