Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET中TransactionScope的问题_C#_Sql Server_Transactions_Transactionscope - Fatal编程技术网

C# ASP.NET中TransactionScope的问题

C# ASP.NET中TransactionScope的问题,c#,sql-server,transactions,transactionscope,C#,Sql Server,Transactions,Transactionscope,我构建了一个类来同步两个不同数据源之间的数据。此同步分为多个部分(和方法)。每个方法都有自己的TransactionScope,并且这些方法是按顺序运行的 每次运行此代码时,我都会收到以下错误消息: “与当前连接关联的事务已完成,但尚未处理。必须先处理该事务,然后才能使用连接执行SQL语句。” 以下代码是具有TransactionScope的此类方法的示例: private void SomeMethod() { try { using (

我构建了一个类来同步两个不同数据源之间的数据。此同步分为多个部分(和方法)。每个方法都有自己的TransactionScope,并且这些方法是按顺序运行的

每次运行此代码时,我都会收到以下错误消息:

“与当前连接关联的事务已完成,但尚未处理。必须先处理该事务,然后才能使用连接执行SQL语句。”

以下代码是具有TransactionScope的此类方法的示例:

private void SomeMethod()
{
        try
        {
            using (var _transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
            {
                using (SqlConnection _connection = new SqlConnection(connectionstring))
                {
                    _connection.Open();

                    DoSomething()...
                }

                _transactionScope.Complete();
            }
        }
        catch (TransactionAbortedException e)
        {
            nlog.Error(string.Format("The transaction has been aborted: {0}", e.Message));
            throw e;
        }
        catch (Exception e)
        {
            throw e;
        }
}
调用“\u transactionScope.Complete()”似乎不足以杀死transactionScope。。有人知道我做错了什么吗

提前谢谢

更新 谢谢你的回复。经过几次测试,我发现这个问题只在一个方法中有多个查询时存在。例如:

 try
    {
        using (TransactionScope _transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
        {
            using (SqlConnection _connection = new SqlConnection(connectionstring))
            {
                _connection.Open();

                //new method:
                using (TransactionScope _transactionScope = new TransactionScope(TransactionScopeOption.Suppress))
                {
                    //a selectquery
                }

                //an update or insert query

            _transactionScope.Complete();
        }
    }

尝试更改构造函数

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,
                new TransactionOptions()
                { 
                    IsolationLevel = System.Transactions.IsolationLevel.Serializable,
                    Timeout = TimeSpan.FromSeconds(120)
                }))

我做了一个在事务作用域上创建最大超时值的方法

public static TransactionScope CreateDefaultTransactionScope(TransactionScopeOption option = TransactionScopeOption.Required)
    {
        var transactionOptions = new TransactionOptions();
        transactionOptions.Timeout = TimeSpan.MaxValue;
        transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
        return new TransactionScope(option, transactionOptions);
    }
然后你会使用它:

using (TransactionScope transaction = TransactionHelper.CreateDefaultTransactionScope())

也请查看此链接:您的交易持续时间是否超过10分钟?我认为有些交易持续时间超过10分钟,但我通过将“transactionOptions.Timeout”属性和de-SqlCommand.CommandTimeout属性设置为1小时来处理此问题。如果事务运行的时间长于maxTimeout,则可能会发生此错误。看看这个博客:或者这个答案:只是一个技术说明。。。不要“扔e”,只用“扔”。这将保留调用堆栈。