Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 如何防止在使用合并时锁定源表?_Sql Server_Tsql - Fatal编程技术网

Sql server 如何防止在使用合并时锁定源表?

Sql server 如何防止在使用合并时锁定源表?,sql-server,tsql,Sql Server,Tsql,链接: 它说“不允许NOLOCK和READUNCOMMITED。” 如果我不能在MERGE语句中使用NOLOCK,那么有没有办法防止源表被锁定 例如,通过使用NOLOCK创建一个在源表上具有select查询的视图。然后我可以使用这个视图作为合并查询的源表。这是在执行合并时防止锁定源表的一种好方法吗?文档中说,对于目标表而不是表源,“不允许NOLOCK和READUNCOMMITED” 在默认隔离级别下,SQL Server使用共享锁进行读取。表源通常不会完全锁定。SQL Server通常使用行锁,

链接:

它说“不允许NOLOCK和READUNCOMMITED。”

如果我不能在MERGE语句中使用NOLOCK,那么有没有办法防止源表被锁定

例如,通过使用NOLOCK创建一个在源表上具有select查询的视图。然后我可以使用这个视图作为合并查询的源表。这是在执行合并时防止锁定源表的一种好方法吗?

文档中说,对于目标表而不是表源,“不允许NOLOCK和READUNCOMMITED”

在默认隔离级别下,SQL Server使用共享锁进行读取。表源通常不会完全锁定。SQL Server通常使用行锁,但它们可以升级为表锁

readcommittedsapshot
隔离级别表下,除了模式稳定性锁之外,源根本没有被锁定


通过MERGE语句在目标表中更新或插入的行始终由SQL Server以独占方式锁定,并且SQL Server可以再次升级为表锁。

我应该在MERGE语句中的何处放置NOLOCK以防止对源表的任何锁定?示例:使用SOURCETBL B将TARGETTBL A与A.ID=B.ID上的NOLOCK合并。这是对的。使用NOLOCK永远都不对。请改用读取提交的快照隔离级别,它具有NOLOCK的所有优点,并且没有任何缺点Rowlock从不升级为页锁,只升级为表/分区锁。引擎在启动时决定是从行、页还是表开始locks@Charlieface谢谢你指出这一点。编辑答案:你认为你有什么问题,
NOLOCK
可以解决?
NOLOCK
不太可能是正确答案,更不用说在数据修改上下文中总是忽略
NOLOCK
。如果必须使用NOLOCK,则可以使用标准T-SQL编写合并模式。”合并“只是一个编程构造。可以得到相同的结果。而且,从我的观点来看,你最好不要合并。它对性能的影响太大,我无法在生产环境中使用它。下面是一篇关于合并引起的性能问题的文章。SQL server默认值为“已读已提交”。在此模式下,合并运行时,源表行将被锁定。所以我想用nolock@jim
MERGE
确实存在并发性问题,以及(现在大部分已修复)bug,如那篇文章中所述。如果使用正确,则没有性能问题的迹象