【发布时间】:2013-02-25 18:12:44
【问题描述】:
我有一个名为Products 的表,其中包含许多列。它是用于报告目的的临时表。多个用户请求将同时处理数据到该表。有单独的存储过程可以对该表进行 DML 操作。
表结构:
CREATE TABLE Products (
instance uniqueidentifier,
inserted datetime,
col1,
col2,
...
)
inserted 列将填充 GETDATE() 以包含插入每一行的时间,instance 列将包含来自 newid() 的值。一个用户请求将有一个唯一的 id,但可能有数百万行。以下是将并发执行的查询,这会导致死锁。请指教
查询 1:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE instance = 'XXXX-xxx-xxx-xx'
查询 2:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE inserted <= DATEADD(hh, -10, GETDATE())
注意:非聚集索引是在实例列上创建的。
请告诉我在这种情况下我可以使用哪种锁。
请注意,当我向表中插入 1000 万行时,我无法主键,因为它会消耗时间(这是一个事务;有 20 个并发事务)。
报告应尽快生成。我的程序有多个 35 个 DML 语句,大约有 15 个 DELETE 语句,例如带有其他列的实例列(DELETE FROM table WHERE instance = @instance AND col1 = @col1)。
【问题讨论】:
标签: sql sql-server deadlock