很长一段时间我在使用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.BeginTransaction
与SqlConnection.BeginTransaction
混为一谈。