你目前正处于脱机状态,正在等待 Internet 重新连接

FIX: 一个表的锁都不升级时 SQL Server 2008 中的表中插入多行

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 2448971

症状
请考虑以下情形:

  • 将多行插入到 Microsoft SQL Server 2008 中的表使用以下查询之一:
    • INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
    • SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
    备注
    • <target_table></target_table>占位符代表实际的目标表名。
    • <predicate></predicate>占位符代表实际的谓词。
    • <source_table></source_table>占位符代表实际的源表。
  • 超出了表的锁升级阈值。
在这种情况下,数据库引擎不会提升表的锁。
原因
因为 SQL Server 不会在内部计算由 INSERT 操作生成的所有新锁,就会发生此问题。 因此,锁升级阈值可能不会触发时需要。
解决方案

服务包信息

若要解决此问题,获取最新的 service pack,SQL Server 2008 的。

有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
968382如何获取最新的 service pack,SQL Server 2008 为
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。
此问题已首先更正 SQL Server 2008 Service Pack 2 中为 SQL Server 2008。

更多信息
有关锁升级的详细信息,请访问下面的 Microsoft TechNet 网站:
若要确定是否都升级为表的锁,运行以下 TRANSACT-SQL 语句:
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x   
如果上报表的锁,是最后一个 SELECT 语句返回的值12. 如果不上报表的锁,是最后一个 SELECT 语句返回的值40,06640,067.


Warning: This article has been translated automatically

属性

文章 ID:2448971 - 上次审阅时间:11/05/2010 07:55:00 - 修订版本: 2.0

Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Developer

  • kbqfe kbfix kbexpertiseadvanced kbsurveynew kbmt KB2448971 KbMtzh
反馈
.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">