SQL SERVER 数据库的锁

1SQL SERVER 锁的概念

共享锁:用于读取资源所加的锁。拥有共享锁的资源不能被修改。共享锁在默认情况下是读取了资源马上被释放。

排他锁:和其他锁都不兼容,包括其他排他锁,排它锁用于修改数据,当资源上加了排他锁时,其他请求读取或修改这个资源的事物都会被阻塞,直到排他锁被释放为止。

更新锁:是共享锁和排它锁的结合,用于更新数据,更新数据时首先需要找到被更新的数据,此时可以理解为被查找的数据上了共享锁。当找到需要修改的数据时,需要对被修改的资源上排他锁。

sql server 通过更新锁来避免死锁的问题,因为共享锁和共享锁是兼容的,通过更新锁和共享锁兼容,使得更新查找时并不影响数据查找,而更新锁和更新锁之间是不兼容的,从而减少了死锁的可能性。

举例说明以上描述的锁:

1.1. 创建环境

---创建表

Createtable student

(

studentidint,

sname nvarchar(10),

sex nchar(1)

--插入学生

insert student values (1,'张飞','女')

insert student values (2,'甄姬','男')

insert student values (3,'招新','女')

insert student values (4,'王五','女')

insert student values (5,'李四','男')

1.1. 排他锁

.新建两个连接

在第一个连接中执行以下语句

begintran

update dbo.student set sname='王景正' where studentid=1

waitfordelay'00:00:30'

committran

在第二个连接中执行以下语句

begintran

select * from dbo.student where studentid=1

committran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行既要等待30秒

1.1. 共享锁

在第一个连接中执行以下语句

begintran

select * from dbo.student with (holdlock)

where sex='女'

waitfordelay'00:00:30'

committran

在第二个连接中执行以下语句

begintran

select studentid,sname from dbo.student where sex='女'

update dbo.student set sname='韩旭' where sex='女'

committran

若同时执行上述两个语句,则第二个连接中的select查询可以执行,而UPDATE必须等待地一个事物释放

共享锁转为排它锁后才能执行,既要等待30秒.

1.1. 死锁

1.1. 更新锁

更新锁

在第一个连接中执行以下语句

begintran

select * from dbo.student with (updlock)where sname='华荣'

waitfordelay'00:00:30'

update dbo.student set sname='白楠楠'

committran

select * from sys.dm_tran_locks

在第二个连接中

begintran

select * from dbo.student with (updlock) where sname='华荣'

waitfordelay'00:00:30'

在第二个连接中如果同样加更新锁,则会阻塞当前查询,直到连接释放更新锁。

如果不加更新锁则直接可以读取更新锁的记录。

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

原文地址:http://blog.51cto.com/13137225/2065521

时间: 2024-08-04 12:58:49

SQL SERVER 数据库的锁的相关文章

SQL Server 数据库的维护(三)__事务(transaction)和锁

--锁 注:SQL Server中的锁用来控制一个事务与另一个事务并发性.系统会自动为被访问的资源设置或释放锁.如果某个事务以锁定一个资源,而另一个事务要访问该资源,那么SQL Server会根据第一个事务所使用的锁模式的兼容性来确定是否授予第二个锁. 资源的锁定模式可分为 意向共享(IS).共享(S).更新(U).意向排他(IX).意向排他共享(SIX)和排他(X)六种模式. 死锁现象:在多个任务中,如果一个任务锁定了其他任务试图锁定的资源,此时会造成任务的永久阻塞,从而出现死锁现象. ---

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用

提高SQL Server数据库效率常用方法

1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优化 ●可以通过如下方法来优化查询 : 1.把数据.日志.索引放到不同的

sql server中的锁 事务锁 更新锁 保持锁 共享锁 你知道吗?

锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SELECT 语句中"加锁选项"的功能说明 SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能.用户既能使用SQL Ser

影响SQL Server数据库应用性能的几个常见因素

本文转自:http://blogs.msdn.com/b/apgcdsd/archive/2012/01/18/sql-server-2012-1-18.aspx 影响SQL Server数据库应用性能的几个常见因素 性能问题是困扰数据库用户的常见问题之一.经常会有人因为遇到性能问题,质疑SQL Server处理大型数据应用的能力.其实,作为一个在市场上经营了二十多年,出了好几代版本的数据库产品,SQL Server作为一个企业级数据库的能力,是毋庸置疑的.在实际应用中,数据量达到几百GB,甚至

SQL server 数据库用户表名称

转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select name from sysobjects where xtype='U' order by name SQL server数据库系统表详解: sysaltfiles 主数据库 保存数据库的文件 syscharsets 主数据库字符集与排序顺序 sysconfigures主数据库 配置选项 sysc

我的SQL SERVER数据库会装满吗?

原文:我的SQL SERVER数据库会装满吗? 概述 今天有个客户问我一个蛮有意思的问题.我使用的SQL SERVER 2008数据库,目前数据库130多G,其中某个表的记录条数就有3亿1千多万,占用了50多G.那SQL SERVER 数据库中的表有没有行数和列数限制呢?会不会突然有一天,超过这个限制,我的系统就不能使用了? 最大容量 SQL SERVER 是否会被装满,主要是在于数据库的最大容量.包括最大行数和最大列数 以及其他. 具体内容,我们可以查看下面列表: SQL Server 数据库

SQL Server中的锁的简单学习

原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要

T-SQL查询进阶—理解SQL Server中的锁

在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事务和事务的