我有一个Kimball风格的DW(星型模型中的事实和维度 - 没有迟到的事实行或列,没有列的尺寸变化,除了过期作为类型2缓慢变化的尺寸的一部分),每日处理繁重以插入和更新行(新日期)以及每月和每日报告流程.事实表按日期划分,以便轻松滚动旧数据.
我理解WITH(NOLOCK)可以导致读取未提交的数据,但是,我也不希望创建任何会导致ETL进程失败或阻塞的锁.
在所有情况下,当我们从DW读取时,我们正在从事实表中读取一个不会改变的日期(事实表按日期划分)和维度表,这些表不会因为链接到的事实而改变属性.
那么 - 有什么缺点吗?- 可能在执行计划中或在SELECT相同表中并行运行的此类非常查询的操作中.
我们正在评估EF4,我的DBA说我们必须在所有SELECT语句中使用NOLOCK提示.所以我正在研究如何在使用EF4时实现这一点.
我已经阅读了关于如何在EF4中实现这一点的不同想法,但所有这些似乎都是一种解决方案而不是微软或EF4批准的.在使用LINQ-to-SQL/LINQ-to-Entities和EF4时,希望他们的SELECT语句包含NOLOCK提示的人的"官方Microsoft"响应是什么?
顺便说一下,我发现的绝对最好的信息就在这里,我鼓励每个对这个主题感兴趣的人阅读这个主题.
谢谢.
在MS SQL Server 2008中,您可以这样写:
FROM EMPLOYEE as A with (nolock)
Run Code Online (Sandbox Code Playgroud)
DB2 9.7是否有等效的语法?谢谢
我有一个关于使用的问题NOLOCK。
我知道NOLOCK提示并不总是最好的方法,但在某些情况下它非常有帮助。我并不是想养成一直使用它的坏习惯
我只是想了解它的确切行为。有这样一个不切实际的假设:正在更新 id = 10 的记录的进程UPDATE table1 SET status = 2 WHERE id = 10需要 30 秒来更新。同时我执行SELECT * FROM table1 WITH NOLOCK where id = 10
即使我的第一个查询在记录上有独占锁,我的 select 语句是否会读取该行,或者我的 select 查询是否会等到记录上没有锁才允许读取?
我想知道使用是否NOLOCK会导致延误。
我有两个存储过程在不同的线程中运行,在SQL Server 2005上运行.一个过程将新行插入到一组表中,另一个过程从同一组表中删除旧数据.这些过程在表DLevel和Model上遇到死锁.这是架构:
滚动条图像http://www.barramsoft.com/pub/images/DeadLock2.jpg
表DFile:主键= DFileID
表DLevel:主键= DLevelID,外键:DFileID
表模型:主键= ModelID,外键:DFileID
表ELement:主键= ElementID,外键1:DFileID,外键2:DLevelID
我已经隔离了导致死锁的确切的两个SQL语句(每个存储过程一个).我已经看到任何一个程序报告的死锁.我在两种情况下都使用top(1000),并且两个语句都在循环中执行,直到它们完成而没有剩下的行来删除/插入.
SQL语句1:
while (...)
begin
delete top (1000) from DLevel where DFileID = @fileID1
...
end
Run Code Online (Sandbox Code Playgroud)
SQL语句2:
while (...)
begin
insert into Element (ElementID, DFileID, LevelNum, ...)
select top (1000) el.ElementID, el.DFileID, el.LevelNum, ...
from ElementLoader el with (nolock)
left outer join Element e with (nolock)
on e.ElementID = el.ElementID
where el.DFileID = @fileID2
and e.ElementID …Run Code Online (Sandbox Code Playgroud) 我在我的程序中声明了一个表,您可以在下面看到:
Declare @resultTable Table
(
EmpId int,
EmpStatusId int,
CreatedDateTime datetime
)
Run Code Online (Sandbox Code Playgroud)
我执行删除功能:
Delete From ActualTable
Where Id = (Select EmpId from @resultTable with (nolock) where EmpStatusId = @tempId)
Run Code Online (Sandbox Code Playgroud)
我试图避免锁定在select语句中,以避免死锁,即使我读取脏数据.但是,不允许"with(nolock)".错误说:
关键字'with'附近的语法不正确.如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句.
有没有办法在临时表中应用NOLOCK?
我正在尝试在更新查询中添加 with(NOLOCK):
UPDATE pth_patchLookup with(nolock) SET ScanDateTime = Getdate() WHERE RegID = 312
Run Code Online (Sandbox Code Playgroud)
但我收到以下消息:
NoLock hint is supported only with Select statement and not with update, insert and delete.
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在此更新查询中应用“NOLOCK”?
谢谢你的帮助
有人知道with (nolock)在使用时是否可以告诉dapper追加connection.GetList<TView>()?
我使用它作为我的CQRS模型中的R并且它运行良好但我现在担心我们正在做更多的重读,它将开始锁定表.如果可能的话,我宁愿不在混合中添加交易.
我正在 C#.Net 中创建一个自我项目,通过使用 3 层应用程序,我不想让我的 sql 语句具有事务性,这些语句用于多个存储过程,我一直在使用 WITH(NOLOCK)方法来查询在事务期间用于插入或更新的那些表,在 C# 方面我一直在使用 TransactionScope,但我最近读到不推荐使用 WITH(NOLOCK),因为它会导致幻像读取或使用脏的和不一致的数据。我的问题是,为了使用在事务期间插入或更新的数据,当涉及到选择时,事务操作方面的最佳方法是什么?无论是数据库端还是业务代码端。
我试图在报告查询中添加 with (nolock) ,运行时会锁定整个数据库,从而使其他用户无法使用该数据库。
我不知道在这种情况下如何使用:
-- this is just an example:
SELECT FIELDS FROM (SELECT * FROM ATABLE) AS SUB
Run Code Online (Sandbox Code Playgroud)
这给出了语法错误:
SELECT FIELDS FROM (SELECT * FROM ATABLE) WITH (NOLOCK) AS SUB
Run Code Online (Sandbox Code Playgroud)
WITH (NOLOCK)应该放在哪里?
我并不是说这是所有问题的解决方案,这只是我想要的一个测试。
谢谢!
nolock ×10
sql-server ×7
sql ×4
.net ×1
dapper ×1
db2 ×1
deadlock ×1
linq ×1
locking ×1
transactions ×1