首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlException:死锁

SqlException:死锁
EN

Stack Overflow用户
提问于 2010-11-30 10:18:46
回答 3查看 35.7K关注 0票数 16

当我试图从C#中的SQL数据库获取数据时,会产生以下两个异常:

System.Data.SqlClient.SqlException:事务(进程ID 97)与另一个进程在锁定资源上陷入僵局,并被选择为死锁受害者。

System.Data.SqlClient.SqlException:事务(进程ID 62)与另一个进程在锁定资源上陷入僵局,并被选择为死锁受害者。

System.Data.SqlClient.SqlException:事务(进程ID 54)与另一个进程在锁定资源上陷入僵局,并被选择为死锁受害者。重新运行事务。

这是代码:

代码语言:javascript
复制
 using (SqlConnection con = new SqlConnection(datasource))
 {
    SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con);
    cmd.CommandTimeout = 300;
    con.Open();
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    con.Close();
    return ds.Tables[0];
 }

每次都会发生这种事。

对于如何解决这些问题,有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-30 14:36:21

这并不是说这会解决死锁问题,但您应该将其他IDisposable对象配置为类似于这样的SqlConnection

代码语言:javascript
复制
    using (SqlConnection con = new SqlConnection(datasource))
    using (SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con))
    {
        cmd.CommandTimeout = 300;
        con.Open();
        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        using (DataSet ds = new DataSet())
        {
            adapter.Fill(ds);
            return ds.Tables[0];
        }
    }

您可以在查询中使用锁定提示来避免锁定:

代码语言:javascript
复制
Select * from MyTable with (nolock) Where ID='1'

不过,我想说清楚,您可以使用此解决方案读取未提交的数据。这是交易系统中的一个风险。读这个答案。希望这能有所帮助。

票数 9
EN

Stack Overflow用户

发布于 2010-11-30 14:08:57

你可以做几件事情来减少你收到的死锁的数量,还有一些你可以做的事情来完全消除它们。

首先,启动Server并告诉它给您一个死锁图。运行此跟踪将告诉您另一个与您的查询冲突的查询。您的查询非常简单,尽管我非常怀疑您在系统中是否有一个名为SELECT *的表中的MyTable查询.

无论如何,使用死锁图和其他查询,您应该能够知道哪些资源处于死锁状态。经典的解决方案是改变两个查询的顺序,以便以相同的顺序访问资源--这就避免了循环。

其他你可以做的事情:

  • 通过将正确的索引应用于查询,可以加快查询的速度。
  • 在数据库上启用快照隔离,并酌情在事务中使用SET TRANSACTION ISOLATION LEVEL SNAPSHOT。还启用了使用行版本控制提交的读取。在许多情况下,这足以完全消除大多数死锁。了解有关事务隔离级别的信息。理清你在做什么。
票数 26
EN

Stack Overflow用户

发布于 2010-11-30 13:58:09

基本上,SQL服务器并发模型使得您永远无法避免此异常(例如。完全无关的事务如果碰巧锁定相同的索引页或其他东西,可能会彼此阻塞)。您所能做的最好是保持您的事务简短,以减少相似之处,如果您得到异常,按它说的做,然后重试事务。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4312563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档