如果您的程序報如下錯誤,那么說明你的程序中多個資源同時操作某張表,競爭力若的需要等待競爭力強的資源,等待釋放后才能操作,導致數據庫死鎖:System.Data.SqlClient.SqlException (0x80131904): 事務(進程 ID 112)與另一個進程被死鎖在 鎖 | 通信緩沖區 資源上,並且已被選作死鎖犧牲品。請重新運行該事務。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout)
在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在 Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(SqlConnection connection, CommandType commandType, String commandText, SqlParameter[] commandParameters)
在 Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(String connectionString, CommandType commandType, String commandText, SqlParameter[] commandParameters)
死鎖是不可避免的,但是我們要竟可能的避免數據庫死鎖,解決方法如下:
下列方法有助於最大限度地降低死鎖:
1.按同一順序訪問對象
2.盡量能減少就減少數據庫操作次數
3.如果某一個動作響應太慢,可使用多線程操作,來提高速度
4.添加try catch 異常捕捉機制,如果發生死鎖,肯定會拋出異常,在異常種 sleep幾秒后重新執行該過程