【发布时间】:2014-01-16 16:22:08
【问题描述】:
我有一个正在更新的表,更新本身需要 8 秒才能完成。当用户进来时,我需要更新表格并向他们展示表格中的总和:
查询
SELECT Jaccard/(SELECT SUM(Jaccard) FROM PreProcessed)
FROM PreProcessed
WHERE MinX = 25 AND MinY = 25
AND MaxX = 26 AND MaxY = 26
问题是多个用户可以同时进来,UPDATE语句的X锁意味着我不能长时间从表中读取。
我想知道我应该使用什么类型的LOCK 来允许查询能够在更新发生时从先前提交的数据中获取SELECT?我最初想使用READCOMMITTED,但它似乎没有达到我想要的效果。我想要更新前的数据,而不是部分提交的数据。
存储过程
set statistics time ON
DECLARE @MinX INT = 0;
DECLARE @MinY INT = 0;
DECLARE @MaxX INT = 50;
DECLARE @MaxY INT = 50;
DECLARE @Lambda DECIMAL(10, 5) = 0.5;
DECLARE @ReverseLambda DECIMAL(10, 5) = 1 - @Lambda;
DECLARE @Area INT = (@MaxX - @MinX) * (@MaxY - @MinY);
UPDATE PreProcessed
SET Jaccard = (@ReverseLambda * Jaccard) + (@Lambda * dbo.fn_ComputeJaccard(@MinX, @MinY, @MaxX, @MaxY, @Area, MinX, MinY, MaxX, MaxY))
FROM PreProcessed
set statistics time off
如果有的话,我可以做些什么来允许在我的更新期间发生读取?
编辑
select CAST(1 AS DECIMAL(38, 28))/CAST(1625625 AS DECIMAL(38, 28))
select CAST(1 AS DECIMAL(20, 10))/CAST(1625625 AS DECIMAL(20, 10))
【问题讨论】:
-
如果您对脏读没问题,您可以尝试将事务隔离级别设置为未提交读:stackoverflow.com/questions/2471055/…
-
@Dan - 脏读是禁忌。我真的需要它尽可能地读取以前提交的数据(在整个更新之前)。我什至考虑过使用临时表,但合并需要 12 秒...这再次锁定了表...
标签: sql sql-server-2008 select locking sql-update