SELECT 语句中“加锁选项”的功能说明
  SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果。 本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。
  功能说明:  
  NOLOCK(不加锁) 
  此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。 
  
  HOLDLOCK(保持锁) 
  此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。 
  
  UPDLOCK(修改锁) 
  此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。 
  
  TABLOCK(表锁) 
  此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。 
  
  PAGLOCK(页锁) 
  此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。 
  
  TABLOCKX(排它表锁) 
  此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。 
  
  使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(Transaction Isolation Level)。 请查阅SQL Server 联机手册获取更多信息。
  
--------------------------------
如:select * from 表 with (TABLOCKX)

解决方案 »

  1.   

    如何锁一个表的某一行
    A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行这样只能不允许更新你的要求只能用 
    SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
    SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除
      

  2.   

    select * from table1 tablockx
      

  3.   

    我用过TABLOCKX,他在多事务同时并发时,我想是排它的。但是我先select * from MenuT With(TABLOCKX) where iNo=1(用delphi执行),再select * from MenuT With(TABLOCKX) where iNo=1,还是用delphi(另外一个程序)执行,第二个照样显示。后来我发现书上说select语句的事务是自动提交模式,也就是说我一select,事务就结束了,当然TABLOCKX也就失效了。怎么能在select后事务不自动结束呢?上面三位都是高手,再帮我想想吧?是不是要设什么东东???
      

  4.   

    呵呵,那就在事务中执行Select就行了
    delphi我没有用过,但我想应该有这个语句
    connection.BeginTransaction
    select ... with (tablockx)
    connection.EndTransaction或者
    session.BeginTransaction
    select ... with (tablockx)
    session.CommitTransaction
      

  5.   

    zzhcom(志成) 说的有一定道理,但光transaction加select是不行的。还得想些其他办法(在编程上控制)。可惜SQLServer本身解决不了这个问题,谢谢各位,结了。