利用索引降低并发事务引起的锁【转】

时常,来自不同连接的线程会对同一张表进行读/更新操作,这种并发操作会导致阻塞,同时SQL Server会自动处理以防止脏读。然而,有种情景很常见,那就是每个连接要读/更新的行互相排斥,换句话说,就是各个连接读/更新的行没有交集。在这片文章中,将像大家展示如何恰当地使用索引来降低阻塞的发生,以便多个读/更新能够同时操作同一张表。

创建TEST表如下:

  1. SET ANSI_NULLS ON

  2. GO  
  3. SET QUOTED_IDENTIFIER ON

  4. GO  
  5. CREATE TABLE [dbo].[TEST](

  6. [ID] [int] IDENTITY(1,1) NOT NULL,  
  7. [NAME] [nvarchar](20) NULL,  
  8. [TEL] [varchar](20) NULL
  9. ) ON [PRIMARY]  
  10. GO

塞入两笔记录:

  1. INSERT TEST(NAME,TEL)

  2. SELECT N‘阿三‘,‘12345678901‘
  3. UNION ALL
  4. SELECT N‘李四‘,‘23456789012‘

开启两个查询,分别执行如下T-SQL:

  1. BEGIN TRAN

  2. UPDATE TEST  WITH(ROWLOCK)  
  3. SET TEL = ‘11111111111‘
  4. WHERE ID=1

  1. BEGIN TRAN

  2. UPDATE TEST  WITH(ROWLOCK)  
  3. SET TEL = ‘22222222222‘
  4. WHERE ID=2

这是我们可以发现第一个T-SQL执行后的状况如下:

然而,第二个T-SQL执行时就pending在那里:

通过sp_lock查看:

由上图可以看出,资源1:498424:0被spid(56)排他锁定(X),而迫使spid(52)对其更新(U)等待(WAIT),因此就是我们看到的执行第二个更新事务时,一直处于等待状态,因为排他锁(X)没有释放。

关于锁模式的说明如下,更多信息可参考官网(http://technet.microsoft.com/zh-cn/library/ms175519.aspx)。

锁模式

说明

共享 (S)
用于不更改或不更新数据的读取操作,如 SELECT 语句。

更新 (U)
用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排他 (X)
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。

意向
用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。

架构
在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

大容量更新 (BU)
在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。

键范围
当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。

关于锁定资源的说明如下,更多信息可参考(http://technet.microsoft.com/zh-cn/library/ms189849(v=SQL.105).aspx

资源

说明

RID
用于锁定堆中的单个行的行标识符。

KEY
索引中用于保护可序列化事务中的键范围的行锁。

PAGE
数据库中的 8 KB 页,例如数据页或索引页。

EXTENT
一组连续的八页,例如数据页或索引页。

HoBT
堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。

TABLE
包括所有数据和索引的整个表。

FILE
数据库文件。

APPLICATION
应用程序专用的资源。

METADATA
元数据锁。

ALLOCATION_UNIT
分配单元。

DATABASE
整个数据库。

对于这种这种并发操作,我们可以通过索引来改善锁:

如下创建主键索引:

view plain

  1. ALTER TABLE [dbo].[TEST] ADD CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED

  2. (  
  3. [ID] ASC
  4. )WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE  =OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =ON,ALLOW_PAGE_LOCKS  =ON)ON [PRIMARY]  
  5. GO

这时我们再来执行两个更新事务时,我们发现,均能执行成功,并有没有出现更新(U)等待(WAIT)的的情况。

执行第一个:

执行第二个:

查看sp_lock,在Type这一栏,并没有出现RID,而出现了KEY,并且KEY的资源不一样,排他锁的状态都是GRANT,基本互不影响。

从上面的演示说明可以看出,正确的索引设置有助于降低并发事务引起的锁。

时间: 2024-11-05 20:28:23

利用索引降低并发事务引起的锁【转】的相关文章

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???

并发事务的丢失更新及数据锁机制

在事务的隔离级别内容中,能够了解到两个不同的事务在并发的时候可能会发生数据的影响.细心的话可以发现事务隔离级别章节中,脏读.不可重复读.幻读三个问题都是由事务A对数据进行修改.增加,事务B总是在做读操作.如果两事务都在对数据进行修改则会导致另外的问题:丢失更新.这是本博文所要叙述的主题,同时引出并发事务对数据修改的解决方案:锁机制. 1.丢失更新的定义及产生原因. 丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改.导致第一次操作数据丢失.可以用图表表

数据库事务的悲观锁和乐观锁

转载出处:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.tair

MySQL.存储引擎-事务-隔离级别-锁

1.什么是存储引擎? ? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能 2.存储引擎有那些?这些引擎有那些特性? 2.1.Mylsam MyIsam 存储引擎独立于操作系统,也就是可以在windows上使用,也可以比较简单的将数据转移到linux操作系统上去.这种存储引擎在创建表的时候,会创建三个文件,一个是

事务的乐观锁和悲观锁

Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍. 借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作.本篇我们就来介绍一下这个子句的用法和功能. 从for update子句的语法状态图中,我们可以看出该子句分为两个部分:加锁范围子句和加锁行为子句.下面我们分别针对两个方面的进行介绍. 加锁范围子

Oracle事务之一:锁和隔离

Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇到下面的几种情况: 1.Commit:提交事务. 2.RollBack:回滚. 3.DDL语句:执行和提交DDL语句结果前首先提交当前所有DML语句,成为隐式提交. 4.程序正常退出:自动提交. 5.不正常的程序失败:隐式回滚. 二.事务特性 事务的四个特性:A(原子性).C(一致性).I(隔离性)

数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 2.视图特点 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 视图是由基本表(实表)产生的表(虚表) 视图的建立和删除不影响基本表 对视图内容的更新(添加.删除和修改)直接影响基本表 当视图来自多个基本表时,不允许添加,修改和删除数据 3.视图的本质 视图是根据SQL语句获取动态的数据集,并为其命

InnoDB并发事务

?目录 1.行锁:索引加锁 2.意向锁 3.间隙锁 4.MVCC机制 行锁 InnoDB通过多版本并发控制MVCC来支持事务 InnoDB的设计是为了在处理大数据量的时候得到最好的性能.InnoDB存储引擎维护了一个它自己的缓冲区,用来存储数据和索引.InnoDB将表和索引存储在一个表空间中,这个表空间可能由不同的文件组成.而MyISAM存储引擎的表中每个表都存在一个独立的文件里面. InnoDB事务模型是将传统的两阶段封锁协议同多版本数据库特性相结合.它采用加行级锁和查询不加锁. InnoDB

加锁并发算法 vs 无锁并发算法

Heinz Kabutz 在上周举办了一次成功 JCrete研讨会,我在会上参加了对一种新的 StampedLock(于JSR166中 引入) 进行的评审.StampedLock (邮戳锁) 旨在解决系统中共享资源的争用问题.在一个系统中,如果多个需要读写某一共享状态的程序并发访问这个共享对象时,争用问题就产生了.在设计 上,StampedLock 试图通过一种“乐观读取”的方式来减小系统开销,从而提供比 ReentrantReadWriteLock(重入读写锁) 更好的性能. 在评审过程中,我