У меня есть программа C#, работающая с базой данных SQL Server, работающей на разных клиентских компьютерах. Теперь я получаю это исключение, которое [если не поймают] закрывает мое заявление:Исключение исключений в блокировке блокировки связи в C#/SQLSERVER
Transaction (идентификатор процесса ...) был заведен в тупик на замок | связь буферных ресурсов с другим процессом и был выбран как жертва тупика . Перезапустите транзакцию.
и трассировки стека показывает, что исключение происходит здесь:
в Gui.DB.sqlServerWrapper.MarkAsNonFreshSample (String штрих-код, Int32 Девид)
Где упомянутый метод заключается в следующем :
public void MarkAsNonFreshSample(string barcode, int devID)
{
mux.WaitOne();
var sql = "DELETE FROM results WHERE [email protected] AND [email protected]";
var command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("barcode", barcode);
command.Parameters.AddWithValue("devID", devID);
command.ExecuteNonQuery();
mux.ReleaseMutex();
}
Я использую мьютексы mux для эксклюзивного доступа к соединению sql " conn ", потому что моя программа имеет несколько потоков.
Я не использую сложный запрос или длинную транзакцию (и я предполагаю, что этот короткий запрос является одной транзакцией, которая не должна вызывать тупик. Я ошибаюсь?).
Где проблема и как ее исправить?
* Удалить * мьютекс и глобальной связи. Глобальные соединения гарантируют взаимоблокировки и просто невозможно восстановить в случае ошибки. Соединения должны оставаться открытыми как можно меньше времени –
Можете ли вы восстановить [тупиковый график] (http://dba.stackexchange.com/questions/10644/deadlock-error-isnt-returning-the-deadlock-sql/10646# 10646) и включить его в свой вопрос? –