Sql Server 锁

      1.NOLOCK(不加锁)
  此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”,等于 READ UNCOMMITTED事务隔离级别。

  2.HOLDLOCK(保持锁) 
  此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。持有共享锁,等于SERIALIZABLE事务隔离级别。

  3.UPDLOCK(修改锁) 
  此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。

测试:

在另一个查询里:

BEGIN TRANSACTION

SELECT * FROM myTable WITH (UPDLOCK) WHERE Id in (1,2,3)

waitfor delay '00:00:10' 


update myTable set [Name]='ZZ' where Id in (1,2,3)
commit TRANSACTION

在另一个查询里:
SELECT * FROM myTable WHERE Id in (1,2,3)

可以马上查询到数据。

但如果要更新数据,必须等其他更新锁释放后才能执行。

update myTable set [Name]='ZZ' where Id in (1,2,3)


这就说明,有时候需要控制某条记录在我读取后就不许再进行更新,那么我就可以将所有要处理当前记录的查询都加上更新锁,以防止查询后被其它事务修改.将事务的影响降低到最小

  4.TABLOCK(表锁) 
  此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。

       5.TABLOCKX(排它表锁) 
  此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。

  6.PAGLOCK(页锁) 
  此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。

  7.READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

  8.ROWLOCK 强制使用行锁

  9.UPLOCK 强制在读表时使用更新而不用共享锁

注意: 锁定数据库的一个表的区别 
  SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 
  SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

原文地址:https://www.cnblogs.com/chenh/p/6767646.html