B. 使用 TABLOCK 和 HOLDLOCK 优化器提示
下面的部分事务说明了如何在 Employee 上放置一个显式共享表锁,以及如何读取索引。该锁将在整个事务中被持有。
USE AdventureWorks2008R2 ;
GO
BEGIN TRAN
SELECT COUNT(*) 
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;
我还是不知道 后面with 子句的意思,另外麻烦解释下为什么要跟这个with 有什么用。

解决方案 »

  1.   

    WITH是表提示,加入后显式指定本条SELECT语句执行期间对该表加表锁,并将表锁持续到事务结束(也就是COMMIT和ROLLBACK)
      

  2.   

    显示指定锁的粒度为整个表,
    holdlock就是锁将持续保持到事务结束
    你这个例子要事务结束的话还需要commit tran提交,才可以释放
      

  3.   

    你这个例子要事务结束的话还需要commit tran提交,才可以释放 ?
    这个的意思是:
     如果没有写commit tran 或者ROLLBACK 这个表会一直锁着? 不能有其他操作么?
      

  4.   

    粒度提示:PAGLOCK、NOLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。
    隔离级别提示:HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD 和 SERIALIZABLE。
      

  5.   

    TABLOCK 
    指定表采用的共享锁一直保持到语句结束。如果同时指定了 HOLDLOCK,那么,在事务结束之前将一直保持该共享表锁。如果与 OPENROWSET 大容量行集提供程序一起用于将数据导入无索引的表,则 TABLOCK 将启用多个客户端,同时将数据加载到包含优化日志记录和锁定的目标表中。
    HOLDLOCK 
    等同于 SERIALIZABLE。有关详细信息,请参阅本主题后面的 SERIALIZABLE。HOLDLOCK 仅应用于那些为其指定了 HOLDLOCK 的表或视图,并且仅在使用了 HOLDLOCK 的语句定义的事务的持续时间内应用。HOLDLOCK 不能被用于包含 FOR BROWSE 选项的 SELECT 语句。
    SERIALIZABLE 
    等同于 HOLDLOCK。保持共享锁直到事务完成,使共享锁更具有限制性;而不是无论事务是否完成,都在不再需要所需表或数据页时立即释放共享锁。执行扫描时所用的语义与在 SERIALIZABLE 隔离级别运行的事务的语义相同。有关隔离级别的详细信息,请参阅 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)。
      

  6.   

    可以读,但是不能update,这个是你的holdlock决定的