c# - 如何为 SqlTransaction.Save() 设置超时?

标签 c# sql .net

我得到:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalTransaction.Save(String savePointName)
   at System.Data.SqlClient.SqlTransaction.Save(String savePointName)

如何增加 SqlTransaction.Save() 的超时时间?

最佳答案

现在我真的希望我没有鼓励 PSVSupporter 删除他的答案(如果他取消删除,请给他投票)。

在内部,当您发出任何事务请求时,该请求使用基础连接的 ConnectionTimeout 属性作为查询的 CommandTimeout

你可以在源码中遵循这个过程,重要的部分在SqlInternalConnectionTds.ExecuteTransactionYukonSqlInternalConnectionTds.ExecuteTransactionPreYukon 都通过ConnectionOptions.ConnectTimeout在它们调用的函数的 timeout 参数中。因此,要解决您的问题,请在创建连接时使用更大的 ConnectionTimeout

SqlTransaction

    public void Save(string savePointName) {
        //SNIP
                _internalTransaction.Save(savePointName);
        //SNIP
    }

SqlInternalTransaction

   internal void Save(string savePointName) {
        //SNIP
             _innerConnection.ExecuteTransaction(SqlInternalConnection.TransactionRequest.Save, savePointName, IsolationLevel.Unspecified, null, false);
        //SNIP
    }

SqlInternalConnectionTds

    override internal void ExecuteTransaction(TransactionRequest transactionRequest, string name, IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest) {
        //SNIP

        if (!_parser.IsYukonOrNewer) {
            ExecuteTransactionPreYukon(transactionRequest, transactionName, iso, internalTransaction);
        }
        else {
            ExecuteTransactionYukon(transactionRequest, transactionName, iso, internalTransaction, isDelegateControlRequest);
        }
    }

    internal void ExecuteTransactionPreYukon(
                TransactionRequest      transactionRequest, 
                string                  transactionName, 
                IsolationLevel          iso, 
                SqlInternalTransaction  internalTransaction) {
        //SNIP

        Threading.Tasks.Task executeTask = _parser.TdsExecuteSQLBatch(sqlBatch.ToString(), 
             ConnectionOptions.ConnectTimeout, null, _parser._physicalStateObj, sync: true);

        //SNIP
    }

    internal void ExecuteTransactionYukon(
                TransactionRequest      transactionRequest, 
                string                  transactionName, 
                IsolationLevel          iso, 
                SqlInternalTransaction  internalTransaction, 
                bool                    isDelegateControlRequest) {
            //SNIP

            _parser.TdsExecuteTransactionManagerRequest(null, requestType, transactionName, isoLevel,
                ConnectionOptions.ConnectTimeout, internalTransaction, stateObj, isDelegateControlRequest);

            //SNIP
    }

关于c# - 如何为 SqlTransaction.Save() 设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993335/

相关文章:

c# - 使用多个 from 字段从 MVC C# 发送电子邮件

c# - 一个 string.Format 问题 (.NET)

mysql - 在我与同一个表连接两次之后,如何在 WHERE 子句中调用具有相同列名的值?

sql - Postgres : Simple SELECT * WHERE . .. AND ... 查询失败

sql - SQL 右连接中的连接约束有什么作用吗?

c# - 静态构造函数和类的同时使用

c# - 在c#中通过正则表达式提取多个字符串

c# - 为什么 Redis 服务器一直在向日志写入信息,即使没有人使用它?

C# 将 FILE STREAM 传递给 EXE 文件

asp.net - 如何根据角色显示或隐藏控件 - ASP.NET MVC 4 Razor