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?
您可以将 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
.
我的应用程序中有简单的 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?
您可以将 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
.