2010-07-06 33 views
3

使用Sql Server 2005.我有一个长时间运行的更新,在我们的生产环境中可能需要大约60秒。更新不是任何显式事务的一部分,也没有任何sql提示。在更新正在运行的过程中,对那些将要更新的行上发生的其他请求有什么期望?表中将有约600万行总数将被更新,其中大约500,000行将被更新。TSQL中长时间运行更新期间的并发性

一些并发顾虑/问题:

1)另一个选择查询(使用NOLOCK提示)是其中一些正在更新的行的在这个表上执行万一。查询是否等到更新完成?

2)其他选择查询没有nolock提示?此查询是否必须等到更新完成?

3)如果另一个更新查询正在对这些行之一执行更新,该怎么办?这个查询是否必须等到它完成?

4)如何删除?

5)如何插入?

谢谢! Dave

回答

0

sql server中的每条语句都在事务中运行。如果你没有明确地启动它,那么服务器为每个语句启动一个语句,如果语句成功则提交它,如果不是,则将其回滚。

确切的锁定,你会看到你的update,不幸的是,取决于。它将以行锁开始,但它很可能会根据您正在更新的行数提升到至少几个页面锁。完全提升到表锁是不太可能的,但这取决于服务器的一定数量 - 如果页锁使用的内存太多,SQL Server将提升它。

如果您的selectnolock一起运行,那么如果您碰巧选择涉及更新的任何行,则会发生脏读。这意味着您将读取未提交的数据,并且可能与其他行不一致(因为这些行可能尚未更新)。

对于所有其他情况,如果您的语句遇到涉及更新的行或锁定页面上的行(假设锁已被提升),那么语句将不得不等待update完成。