我有一个奇怪的问题。我有一个.NET程序,我的进程逻辑需要一个SQL Server 2005数据库上长时间运行的事务(~20分钟)。没关系,因为没有人并行访问数据库。当出现问题时,应该回滚事务。
不经常且没有任何可见模式 Rollback()
对象上的DbTransaction
操作会引发SqlException
:
Message: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding." StackTrace: at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected) at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByte() 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.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) at System.Data.SqlClient.SqlInternalTransaction.Rollback() at System.Data.SqlClient.SqlTransaction.Rollback()
我不知道这是否真的是一个超时问题,因为代码有时会工作,有时却不会。此外,我知道的唯一超时是ConnectionTimeout
和CommandTimeout
,但显然在这种情况下这些不是问题。
有没有人对这个问题有所了解?
非常感谢,Matthias
答案 0 :(得分:24)
Sql Server团队的Matt Neerincx在MSDN forum question中解决了这个问题。奇数但是为真,连接字符串的连接超时用于设置超时。他通过查看源代码验证了。
答案 1 :(得分:3)
交易可能需要一段时间才能回滚;如果这需要太长时间,请确保你会超时。似乎没有一种明显的方法可以影响这一点 - 你可以尝试通过TSQL管理交易 - 然后你可以(ab)使用CommandTimeout
- 但它可能只是那个如果您在交易中进行批次更改,则需要一段时间; SQL Server 假设大多数事情都将运行完成,因此“commit”几乎是免费的,而“rollback”则更昂贵。