【问题标题】:Select and insert at the same moment SQL 2016选择和插入同时SQL 2016
【发布时间】:2019-08-22 12:53:56
【问题描述】:

我的应用程序中有一个简单的表格

ID |价值 |日期 |项目编号

在某些项目插入数据的所有时间里,我的网络服务都被扔到了这个表上。我只插入 5 分钟或更长时间的数据。同时,当我使用我的 Web 应用程序时,我正在为项目选择一些最大值、最小值和当前值。有时我得到了

事务(进程 ID 62)在锁定资源上死锁 另一个进程并已被选为死锁受害者。重新运行 交易。

有没有机会获取数据,在我选择的那一刻,不关心插入?

【问题讨论】:

  • 你在使用 SQL Server 吗?

标签: sql deadlock


【解决方案1】:

如果使用Sql Server 2016

问题: 当我们编写Select 语句时,shared locks 被保存在资源上,例如 TableX,从中选择最大值、最小值和当前值。现在,如果您在这些锁定的表 (TableX) 中 Insert 数据,那么因为 Insert 需要对资源 (TableX) 的 Exclusive 锁定,Insert 语句将等待 Select 获取完成了。

解决方案: 正如下面帖子中所建议的,我们可以使用with (nolock) or with (read uncommitted) 表提示,以便Select 语句不会锁定底层资源(TableX)。但问题是Select可能会读取在事务期间更改的未提交数据,然后回滚到其初始状态(也称为读取脏数据)。

如果您想确保Select 读取已提交的数据并且不阻止Inserts 写入TableX,那么在数据库级别SET READ_COMMITTED_SNAPSHOT ON

【讨论】:

    【解决方案2】:

    你可以使用with(nolock)提示, 这将为您提供未提交的数据。

    在这里查看答案 What is "with (nolock)" in SQL Server?

    这里 http://sqlserverplanet.com/tsql/using-with-nolock

    【讨论】:

    • 如果可以,如果您将其标记为选定答案,我将不胜感激:)
    • 直到现在客户端没有发送任何问题仍然存在的请求:)
    【解决方案3】:

    您可以更改选择查询以避免死锁:

    SELECT ITEMID, MAX(VALUE),MIN(VALUE) FROM table_name WITH(NOLOCK) GROUP BY ITEMID,DATE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2017-09-08
      • 2012-04-12
      • 2014-01-26
      • 2017-04-22
      • 1970-01-01
      • 2014-08-05
      相关资源
      最近更新 更多