NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下, 用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。
这个锁可以读取其他被锁的数据
这个锁只能用于select,不能用于其他类似insert,update等动作
HOLDLOCK(保持锁)
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
主要用于事务
UPDLOCK(修改锁)
此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁, 并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。
注意,上面的关键字“读取数据时”
TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。
共享锁又称为读锁,一个线程给数据加上共享锁后,其他线程只能读数据,不能修改
PAGLOCK(页锁)
此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
行锁锁指定行,表锁锁整张表,页锁是折中实现,即一次锁定相邻的一组记录
TABLOCKX(排它表锁)
此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
关键字,既不能读,也不能写
假如with(tablockx)先执行,普通的SELECT将等待前者完成.
假如普通的SELECT先执行, with(tablockx)也将等待前者结束才执行,如果前者长时间不结束,with(tablockx)将失败。
ROWLOCK(行锁)
试试在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性,又能提高数据操作的并发性
注意事项:
- 如果你错误地使用在过多行上,数据库并不会聪明到自动将行级锁升级到页面锁,服务器也会因为行级锁的开销而消耗大量的内存和CPU,直至无法响应。
- select 语句中,RowLock在不使用组合的情况下是没有意义的,With(RowLock,UpdLock) 这样的组合才成立,查询出来的数据使用RowLock来锁定,当数据被Update的时候,锁将被释放