Sql server 在更新中使用WITH(ROWLOCK)
我有一个.NET工作流应用程序,每天有100个用户使用。此工作流是指正在更新工作流状态ID的表。update语句正在使用rowlock 我在SP中的更新语句:Sql server 在更新中使用WITH(ROWLOCK),sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个.NET工作流应用程序,每天有100个用户使用。此工作流是指正在更新工作流状态ID的表。update语句正在使用rowlock 我在SP中的更新语句: update table1 set statuid = a.statId from table2 a with (rowlock) where ID = @ids 我的问题是:这个更新真的需要行锁吗?难道DB不能自动处理这个问题吗 在这种情况下不需要rowlock update table1 set statuid = a.statI
update table1 set statuid = a.statId from table2 a with (rowlock) where ID = @ids
我的问题是:这个更新真的需要行锁吗?难道DB不能自动处理这个问题吗 在这种情况下不需要rowlock
update table1 set statuid = a.statId from table2 a where ID = @ids
但是,示例SQL语句假设表2中statId只有1个值
编辑:
你在评论中说:
表2中的statuid中可以有多个值。但是,ID在给定时间点是唯一的
我仍然认为rowlock是不必要的,但是为了安全起见,您应该从表2中获取id的最大值
update table1 set statuid = (select max(statId) from table2) where ID = @ids
是的,SQL Server会自动处理此问题-不同之处在于ROWLOCK强制引擎始终发出单个行锁,即使在需要更新大量行时,它会选择升级为页锁或表锁。这可能有助于或阻碍性能,具体取决于场景——或者,如果没有足够的行更新以使锁升级成为必要,则可能根本没有任何影响。很抱歉,难以理解。所以我用一个例子编辑了我的问题。请用简单的语言写什么?假设ID是唯一的键或有索引,是的,行锁是不必要的-引擎将只需要搜索到一行并锁定,对于更新,不需要显式指定。这可能是cargo cult编程的遗留问题,因为添加它在某一点上对某些更新语句有所帮助。最简单的答案是,只有在您尝试了所有其他操作,并且可以清楚地解释和证明为什么需要使用查询提示时,才应该使用查询提示。如果这两种情况都不正确,那么您应该避免对该查询使用查询提示。但是,ID在给定的时间点是唯一的。您仍然认为行锁是必要的吗?我正在通过获取表2的值来更新表1。表2中的statuid中可以有多个值。但是,ID在给定的时间点是唯一的。你仍然认为rowlock是必要的吗?还有,有没有什么方法可以检查或追踪这一点?请注意,在这个实现中,gauss的东西有时有效,有时无效。工作流状态有时更新,有时不更新。那么,在实现此功能或删除行锁之前,我如何才能100%确定?谢谢。请参阅答案编辑。您似乎非常关心这一点,就像您不确定ID在给定时间点是唯一的一样。你应该关心的不是罗洛克,而是你摇摇欲坠的设计。如果要检查或跟踪,可以使用调试器或使用变量检查临时值。