我的应用程序中有一个简单的表
ID |值| DATE | ITEMID
始终有一些项目正在插入数据,这将我的Web服务扔到了该表中。我只插入5分钟或更长时间的数据。在使用Web应用程序的同时,我正在为项目选择一些最大,最小和当前值。我不时得到
事务(进程ID 62)在带有 另一个过程,已被选为死锁受害者。重新运行 交易。
是否有机会获取数据,并且在我选择的那一刻,不关心插入?
答案 0 :(得分:2)
您可以使用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