Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在更新中使用WITH(ROWLOCK)_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 在更新中使用WITH(ROWLOCK)

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

我有一个.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.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在给定时间点是唯一的一样。你应该关心的不是罗洛克,而是你摇摇欲坠的设计。如果要检查或跟踪,可以使用调试器或使用变量检查临时值。