【发布时间】:2017-01-02 16:35:56
【问题描述】:
我有一个 c# 程序与运行在不同客户端 PC 上的 SQL Server 数据库一起工作。 现在,我收到了这个异常,它 [如果没有被捕获] 会关闭我的应用程序:
事务(进程 ID ...)因锁定而死锁 |沟通 与另一个进程缓冲资源,并已被选为 僵局受害者。重新运行事务。
堆栈跟踪显示异常发生在这里:
在 Gui.DB.sqlServerWrapper.MarkAsNonFreshSample(字符串条形码,Int32 devID)
这里提到的方法是这样的:
public void MarkAsNonFreshSample(string barcode, int devID)
{
mux.WaitOne();
var sql = "DELETE FROM results WHERE barcode=@barcode AND devID=@devID";
var command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("barcode", barcode);
command.Parameters.AddWithValue("devID", devID);
command.ExecuteNonQuery();
mux.ReleaseMutex();
}
我正在使用“mux”互斥锁来独占访问 sql 连接“conn”,因为我的程序有多个线程。
我没有使用复杂查询或长事务(我猜这个短查询是一个不会导致死锁的事务。我错了吗?)。
问题出在哪里,我应该如何解决?
【问题讨论】:
-
删除互斥锁和全局连接。全局连接保证死锁并且在出错的情况下根本不可能恢复。连接应尽可能短地保持打开状态
-
您可以检索the deadlock graph 并将其包含在您的问题中吗?
-
虽然共享连接本身不一定是错误的实际原因,但早期使用连接可能已经启动了事务并执行了活动而没有提交或回滚。如果多个客户端执行此操作,然后稍后尝试删除行,则不同的客户端可能因此彼此死锁。请向我们展示使用此共享连接的所有代码——仅此代码本身不太可能遇到此类死锁错误。
标签: c# sql-server deadlock