Select 并同时插入 SQL 2016

Select and insert at the same moment SQL 2016

我的应用程序中有简单的 table

ID | VALUE | DATE | ITEMID

一直以来,有些项目正在插入数据,将我的网络服务扔给了这个 table。我只插入 5 分钟或更长时间前的数据。同时,当我使用我的网络应用程序时,我正在为项目选择一些最大值、最小值和当前值。我时不时得到

Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

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

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

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

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

您可以将 SELECT 查询更改为避免死锁:

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

如果使用 SQL Server 2016:

问题:

当我们写一个 SELECT 语句时,共享锁被持有在资源上——比如 TableX 从中选择最大值、最小值和当前值。现在,如果您 INSERT 这些锁定的 table 中的数据 (TableX),那么因为 INSERT 需要对资源 (TableX) 的独占锁定, INSERT 语句将等待 SELECT 完成。

解法:

正如下面帖子中所建议的,我们可以使用 WITH (NOLOCK)WITH (READ UNCOMMITTED) table 提示,这样 SELECT 语句就不会锁定底层资源( TableX)。但问题是,这个 SELECT 可能会读取在事务期间更改的未提交数据,然后回滚到其初始状态(也称为读取脏数据)。

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