选择并同时插入SQL 2016

时间:2019-04-01 11:09:22

标签: sql deadlock

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

  

ID |值| DATE | ITEMID

始终有一些项目正在插入数据,这将我的Web服务扔到了该表中。我只插入5分钟或更长时间的数据。在使用Web应用程序的同时,我正在为项目选择一些最大,最小和当前值。我不时得到

  

事务(进程ID 62)在带有   另一个过程,已被选为死锁受害者。重新运行   交易。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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 :(得分:0)

您可以更改select查询以避免死锁,如下所示:

从表名中选择ITEMID,MAX(VALUE),MIN(VALUE)WITH(NOLOCK)GROUP BY ITEMID,DATE