sql 各种锁

SELECT * FROM table WITH (HOLDLOCK)

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

SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

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 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。

时间: 2024-08-08 22:09:49

sql 各种锁的相关文章

SQL Server锁分区特性引发死锁解析

原文:SQL Server锁分区特性引发死锁解析 锁分区技术使得SQL Server可以更好地应对并发情形,但也有可能带来负面影响,这里通过实例为大家介绍,分析由于锁分区造成的死锁情形. 前段时间园友@JentleWang在我的博客锁分区提升并发,以及锁等待实例中问及锁分区的一些特性造成死锁的问题,这类死锁并不常见,我们在这里仔细分析下.不了解锁分区技术的朋友请先看下我的锁分区那篇实例. Code(执行测试脚本时请注意执行顺序,说明) 步骤1 创建测试数据 use tempdb go creat

lock(1)——创建及更新表过程中SQL SERVER锁资源分配情况

锁应该说是由关系型数据库ACID(Atomicity,Consistency,Isolation,Durability)特性而引出的. 以下将测试在创建及更新表过程中SQL Server锁资源分配情况 获取当前会话的事务隔离级别:DBCC USEROPTIONS 测试环境:SQL SERVER 2008 R2 read committed隔离级别下 创建表 当我们只是打开一个SSMS查询窗口,选择数据库为master和tempdb时,没有任何锁产生,当我选择其他数据库,sql server就会在

SQL Server 锁的排队机制

1.新建一个表,插入1010000数据: create table test(id int identity(1,1) ,name varchar(600)) go insert into test values(replicate('a',600)); go 1010000 create index idx_test_id on test(id) 2.新开一个会话(A),运行如下语句,由于没有提交,所以会阻塞其他药修改相同数据的会话: begin tran update test set na

了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Server,用锁来避免用户检索未递交的修改记录.在这些系统中,如果用户A在修改一组记录,则其他用户只有等用户A修改完毕了,才能检索. 数据库在每个物理层上设置锁:记录行(rows),数据页(pages, 上百万记录行),扩展页(extends, 多个数据页),整个表,甚至整个数据库.有些数据库(如Or

两个SQL的锁表问题

来自百度 请问: 1.insert into select ...这条将数据从一个表导入另一个表的语句2.delete from ... where ...删除语句以上两条SQL是否会锁表?也就是在执行以上两条SQL时是否无法对表进行其它的INSERT或UPDATE操作?谢谢! 我的意思是执行:insert into TABLE_B select * from TABLE_A;和delete from TABLE_B where ID <= 10;这两条SQL执行的同时,还能对TABLE_A和T

SQL Server 锁

锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制.也就是说,如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作.你能否执行操作取决于其他用户正在进行的操作. 通过锁可以防止的问题 锁可以解决以下4种主要问题: 脏读 非重复性读取 幻读 丢失更新 1.脏读 如果一个事务读取的记录是另一个未完成事务的一部分,那么这时就发生了脏读.如果第一个事务正常完成,那么就有什么问题.但是,如果前一个事务回滚了呢,那将从数据库从未发生的事务中获取了信息. 2.非重复性读取 很

Sql server锁机制

如何查看锁 了解SQL Server在某一时间点上的加锁情况无疑是学习锁和诊断数据库死锁和性能的有效手段.我们最常用的查看数据库锁的手段不外乎两种: 使用sys.dm_tran_locks这个DMV SQL Server提供了sys.dm_tran_locks这个DMV来查看当前数据库中的锁,前面的图2就是通过这个DMV来查看的. 这里值得注意的是sys.dm_tran_locks这个DMV看到的是在查询时间点的数据库锁的情况,并不包含任何历史锁的记录.可以理解为数据库在查询时间点加锁情况的快照

SQL中锁表语句简单理解(针对于一个表)

锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 复制代码代码如下: SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SELECT 语句中"加锁选项"的功能说明 SQL Server提供了强大而完备的锁机制来帮

SQL超过锁请求

---超过锁请求 http://blog.sina.com.cn/s/blog_7fb3b1840100u4dj.html 1.查询造成死锁的SQL语句 当SQL数据库的监控报警显示死锁进程数过多时,首先应该找出造成死锁的SQL语句是什么,打开“查询分析器”,将如下的存储过程输入到文本框中,检查语法,然后运行: use mastergoCREATE PROCEDURE sp_who_lock ASbegindeclare @spid int,@bl int,@intTransactionCoun