数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 1页第 13章 事务和并发控制本章概述本章的学习目标主要内容数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 2页本章概述
无论用户对数据库中的数据如何操作,数据库中的数据都应该保证一致的、稳定的状态。例如,当我们使用一条语句修改关系 Book中的所有图书的价格数据时,我们希望这种修改要么全部完成,要么全部都不做,而不能出现一部分图书的价格修改了,而另外一部分图书的价格没有修改。一个数据库中的数据,经常会有许多用户同时操纵同一个数据,但是数据库管理系统要保证这些用户的操作互相不影响,并且都能得到正确的结果。要实现这些要求,
就得依靠事务和并发控制技术。
本章将首先介绍事务和并发控制技术的基本概念,然后以
Microsoft SQL Server系统为例,研究事务和并发控制技术在数据库产品中的具体实现。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 3页本章的学习目标
理解和掌握事务的概念、特性和基本状态;
理解和掌握事务的基本实现原理;
理解并发操作存在的问题;
理解和掌握锁的类型和作用;
了解 Microsoft SQL Server系统中事务和并发控制的应用。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 4页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 5页
13.1 事务
下面,我们主要介绍事务的基本概念、特性、状态变迁图、事务的并发执行以及事务的一致性级别等内容。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 6页事务的基本概念
无论是从系统设计人员的角度,还是从用户的角度,事务都是一个单元的操作,这些操作要么全部成功,要么全部失败。事务是数据库环境中的逻辑工作单元,相当于操作系统中的进程的概念。
事务可以是隐含的,也可以是定义的。在许多数据库的操作中,一个命令的执行,例如 UPDATE语句就是一个完整的事务。在应用程序中,
事务也可以由用户使用语句定义,例如 BEGIN TRANSACTION语句表示事务的开始,而 END TRANSACTION语句表示事务的结束。
为了保证数据库中的数据总是正确的,一个事务应该具有 ACID属性,
A表示原子性 (Atomicity),C表示一致性 (Consistency),I表示独立性 (Isolation),D表示持久性 (Durability)。事务的 ACID特性和事务的关系可以使用图 13-1来示意表示。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 7页事务的状态变迁图数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 8页事务的并发执行
事务中的语句可以分成两类,一类是 I/O活动,执行的时间是毫秒级,另一类是 CPU的活动,其执行时间是微妙级。在计算机系统中,这两类活动的速度不一样,因此对磁盘的操作和 CPU的操作可以并发执行。
如果多个事务按照顺序执行,那么效率比较低。
但是,如果多个事务并发执行,就可以提高总的效率。事务的执行次序称为调度。如果多个事务依次执行,则称该事务为串行调度。如果利用分时的方法同时处理多个事务,则称该事务为并发调度。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 9页事务的一致性级别
在 SQL语句中,提供了事务一致性的四个等级供用户选择。这四个一致性等级从高到低依次是可串行化 (serializable)、可重复读
(repeatable)、读提交数据 (read committed)和可以读未提交数据
(read uncommitted)。
可串行化级别允许事务与其他事务并发执行,但是系统必须保证调度是可串行化的,不会发生错误。这是最高级别的一致性,也是系统默认的一致性级别。
可重复读就是只允许事务读已提交的数据,且在两次读同一数据时不允许其他事务修改此数据,但是允许该事务与其他事务的并发调度不是可串行化的。
读提交数据就是允许事务读已经提交的数据,但未必要求可重复读。
也就是说,它允许一个事务的两次请求可能得到不同的结果,只要这些数据是已经提交的即可。
可以读未提交数据就是允许事务读已提交或未提交的数据,这是一致性等级最低的事务。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 10页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 11页
13.2 并发控制
前面讲过,事务可以并发执行。由于并发事务之间的相互干扰,有可能破坏事务的独立性,于是会造成丢失修改等问题。
本节将要介绍并发操作可能带来的问题以及如何使用锁来解决这些问题。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 12页并发操作带来的问题
并发操作带来的问题是丢失修改、脏读、不可重复读和幻觉读。
丢失修改就是指当一个事务修改了数据,并且这种修改还没有提交到数据库中时,另外一个事务又对同样的数据进行了修改,并且把这种修改提交到了数据库中。
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。
幻觉读是指当事务不是独立执行时发生的一种现象,例如,第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。
同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 13页锁
为了解决这些并发问题,确保可串行化的方法就是保证事务对数据项的访问以互斥的方式进行,即当一个事务访问某个数据项时,其他任何事务都不能修改该数据项。实现这种要求的最常用的方法就是只允许事务访问该事务当前锁住的数据项。
对数据项加锁的最常见的形式是共享锁和排它锁。如果事务 Ti获得了数据项 D上的共享锁 (Shared,S),则该事务可读数据项 D但是不能写 D。如果事务 Ti获得了数据项 D上的排它锁 (eXclusived,X),则该事务既可读数据项 D又可写数据项 D。每一个事务都需要根据自己将对数据项 D
进行的操作类型申请适当的锁。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 14页死锁
假设有两个事务 T1和 T2都对数据项 U和 V执行操作。如果事务 T1在数据项 U上拥有排它锁,而事务 T2正在申请数据项 U上的共享锁,那么事务 T2必须等待事务 T1释放数据项
U上的排它锁。同样,如果事务 T2在数据项 V上拥有排它锁,而事务 T1正在申请数据项 V上的共享锁,那么事务 T1
必须等待事务 T2释放数据项 V上的排它锁。由于这两个事务在互相等待,哪一个事务都不能继续执行下去,这种状态称为死锁状态。
当死锁状态发生时,系统必须回滚其中的一个事务。只有当某一个事务被回滚了,该事务锁住的数据项才能被解除,
其他事务才可以访问这些数据,才可以继续执行其他操作。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 15页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 16页
13.3 Microsoft SQL Server系统的事务和锁
Microsoft SQL Server系统通过使用事务和锁机制,提供了数据库中并发操作的解决方案。通过使用事务和锁,系统可以防止其他用户修改另外一个还没有完成的事务中的数据,保证数据修改的完整性和可恢复性。
在 Microsoft SQL Server系统中,提供了多种类型的锁,这些锁可以锁定的资源包括行、页、簇、
表和数据库等,允许不同的事务使用不同类型的锁来锁定不同的资源。
下面详细介绍 Microsoft SQL Server系统的事务和锁机制。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 17页事务的类型
在 Microsoft SQL Server系统中,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。
系统提供的事务是指在执行某些 Transact-SQL语句时,一条语句就是一个事务。
另外一种事务,是用户明确定义的事务。在实际应用中,大多数的事务处理就是采用了用户定义的事务来处理。在开发应用程序时,可以使用
BEGIN TRANSACTION语句来定义明确的用户定义的事务。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 18页事务的工作原理数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 19页锁的粒度
为了优化系统的并发性,应该根据事务的大小和系统活动的程度,锁定不同的资源。也就是说,
既可以锁定比较大的资源,也可以锁定比较小的资源。
在 Microsoft SQL Server系统中,已经比较完善地实现了这些要求。
在该系统中,可以锁定的资源有多种,这些可以锁定的资源分别是行、页、簇、表和数据库,他们对应的锁分别是行级锁、页级锁、簇级锁、表级锁和数据库级锁。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 20页锁的类型
在 Microsoft SQL Server系统中,锁定资源的方式有两种基本形式:
一种形式是读操作要求的共享锁
另一种形式是写操作要求的排它锁
除了这两种基本类型的锁之外,还有一些特殊情况的锁,例如意图锁、修改锁和模式锁等。
在这些各种类型的锁中,有些类型的锁之间是可以兼容的,有些类型的锁之间是不兼容的。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 21页死锁和死锁的解决方案
在 Microsoft SQL Server系统中,死锁也是一个非常重要的话题。在事务和锁的使用过程中,死锁是一个不可避免的现象。
在两种情况下,可以发生死锁现象。第一种情况是,当两个事务分别锁定了两个单独的粒度对象,
这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁。
这种死锁是最典型的死锁形式。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 22页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结
无论用户对数据库中的数据如何操作,数据库中的数据都应该保证一致的、稳定的状态。例如,当我们使用一条语句修改关系 Book中的所有图书的价格数据时,我们希望这种修改要么全部完成,要么全部都不做,而不能出现一部分图书的价格修改了,而另外一部分图书的价格没有修改。一个数据库中的数据,经常会有许多用户同时操纵同一个数据,但是数据库管理系统要保证这些用户的操作互相不影响,并且都能得到正确的结果。要实现这些要求,
就得依靠事务和并发控制技术。
本章将首先介绍事务和并发控制技术的基本概念,然后以
Microsoft SQL Server系统为例,研究事务和并发控制技术在数据库产品中的具体实现。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 3页本章的学习目标
理解和掌握事务的概念、特性和基本状态;
理解和掌握事务的基本实现原理;
理解并发操作存在的问题;
理解和掌握锁的类型和作用;
了解 Microsoft SQL Server系统中事务和并发控制的应用。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 4页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 5页
13.1 事务
下面,我们主要介绍事务的基本概念、特性、状态变迁图、事务的并发执行以及事务的一致性级别等内容。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 6页事务的基本概念
无论是从系统设计人员的角度,还是从用户的角度,事务都是一个单元的操作,这些操作要么全部成功,要么全部失败。事务是数据库环境中的逻辑工作单元,相当于操作系统中的进程的概念。
事务可以是隐含的,也可以是定义的。在许多数据库的操作中,一个命令的执行,例如 UPDATE语句就是一个完整的事务。在应用程序中,
事务也可以由用户使用语句定义,例如 BEGIN TRANSACTION语句表示事务的开始,而 END TRANSACTION语句表示事务的结束。
为了保证数据库中的数据总是正确的,一个事务应该具有 ACID属性,
A表示原子性 (Atomicity),C表示一致性 (Consistency),I表示独立性 (Isolation),D表示持久性 (Durability)。事务的 ACID特性和事务的关系可以使用图 13-1来示意表示。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 7页事务的状态变迁图数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 8页事务的并发执行
事务中的语句可以分成两类,一类是 I/O活动,执行的时间是毫秒级,另一类是 CPU的活动,其执行时间是微妙级。在计算机系统中,这两类活动的速度不一样,因此对磁盘的操作和 CPU的操作可以并发执行。
如果多个事务按照顺序执行,那么效率比较低。
但是,如果多个事务并发执行,就可以提高总的效率。事务的执行次序称为调度。如果多个事务依次执行,则称该事务为串行调度。如果利用分时的方法同时处理多个事务,则称该事务为并发调度。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 9页事务的一致性级别
在 SQL语句中,提供了事务一致性的四个等级供用户选择。这四个一致性等级从高到低依次是可串行化 (serializable)、可重复读
(repeatable)、读提交数据 (read committed)和可以读未提交数据
(read uncommitted)。
可串行化级别允许事务与其他事务并发执行,但是系统必须保证调度是可串行化的,不会发生错误。这是最高级别的一致性,也是系统默认的一致性级别。
可重复读就是只允许事务读已提交的数据,且在两次读同一数据时不允许其他事务修改此数据,但是允许该事务与其他事务的并发调度不是可串行化的。
读提交数据就是允许事务读已经提交的数据,但未必要求可重复读。
也就是说,它允许一个事务的两次请求可能得到不同的结果,只要这些数据是已经提交的即可。
可以读未提交数据就是允许事务读已提交或未提交的数据,这是一致性等级最低的事务。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 10页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 11页
13.2 并发控制
前面讲过,事务可以并发执行。由于并发事务之间的相互干扰,有可能破坏事务的独立性,于是会造成丢失修改等问题。
本节将要介绍并发操作可能带来的问题以及如何使用锁来解决这些问题。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 12页并发操作带来的问题
并发操作带来的问题是丢失修改、脏读、不可重复读和幻觉读。
丢失修改就是指当一个事务修改了数据,并且这种修改还没有提交到数据库中时,另外一个事务又对同样的数据进行了修改,并且把这种修改提交到了数据库中。
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。
幻觉读是指当事务不是独立执行时发生的一种现象,例如,第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。
同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 13页锁
为了解决这些并发问题,确保可串行化的方法就是保证事务对数据项的访问以互斥的方式进行,即当一个事务访问某个数据项时,其他任何事务都不能修改该数据项。实现这种要求的最常用的方法就是只允许事务访问该事务当前锁住的数据项。
对数据项加锁的最常见的形式是共享锁和排它锁。如果事务 Ti获得了数据项 D上的共享锁 (Shared,S),则该事务可读数据项 D但是不能写 D。如果事务 Ti获得了数据项 D上的排它锁 (eXclusived,X),则该事务既可读数据项 D又可写数据项 D。每一个事务都需要根据自己将对数据项 D
进行的操作类型申请适当的锁。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 14页死锁
假设有两个事务 T1和 T2都对数据项 U和 V执行操作。如果事务 T1在数据项 U上拥有排它锁,而事务 T2正在申请数据项 U上的共享锁,那么事务 T2必须等待事务 T1释放数据项
U上的排它锁。同样,如果事务 T2在数据项 V上拥有排它锁,而事务 T1正在申请数据项 V上的共享锁,那么事务 T1
必须等待事务 T2释放数据项 V上的排它锁。由于这两个事务在互相等待,哪一个事务都不能继续执行下去,这种状态称为死锁状态。
当死锁状态发生时,系统必须回滚其中的一个事务。只有当某一个事务被回滚了,该事务锁住的数据项才能被解除,
其他事务才可以访问这些数据,才可以继续执行其他操作。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 15页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 16页
13.3 Microsoft SQL Server系统的事务和锁
Microsoft SQL Server系统通过使用事务和锁机制,提供了数据库中并发操作的解决方案。通过使用事务和锁,系统可以防止其他用户修改另外一个还没有完成的事务中的数据,保证数据修改的完整性和可恢复性。
在 Microsoft SQL Server系统中,提供了多种类型的锁,这些锁可以锁定的资源包括行、页、簇、
表和数据库等,允许不同的事务使用不同类型的锁来锁定不同的资源。
下面详细介绍 Microsoft SQL Server系统的事务和锁机制。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 17页事务的类型
在 Microsoft SQL Server系统中,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。
系统提供的事务是指在执行某些 Transact-SQL语句时,一条语句就是一个事务。
另外一种事务,是用户明确定义的事务。在实际应用中,大多数的事务处理就是采用了用户定义的事务来处理。在开发应用程序时,可以使用
BEGIN TRANSACTION语句来定义明确的用户定义的事务。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 18页事务的工作原理数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 19页锁的粒度
为了优化系统的并发性,应该根据事务的大小和系统活动的程度,锁定不同的资源。也就是说,
既可以锁定比较大的资源,也可以锁定比较小的资源。
在 Microsoft SQL Server系统中,已经比较完善地实现了这些要求。
在该系统中,可以锁定的资源有多种,这些可以锁定的资源分别是行、页、簇、表和数据库,他们对应的锁分别是行级锁、页级锁、簇级锁、表级锁和数据库级锁。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 20页锁的类型
在 Microsoft SQL Server系统中,锁定资源的方式有两种基本形式:
一种形式是读操作要求的共享锁
另一种形式是写操作要求的排它锁
除了这两种基本类型的锁之外,还有一些特殊情况的锁,例如意图锁、修改锁和模式锁等。
在这些各种类型的锁中,有些类型的锁之间是可以兼容的,有些类型的锁之间是不兼容的。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 21页死锁和死锁的解决方案
在 Microsoft SQL Server系统中,死锁也是一个非常重要的话题。在事务和锁的使用过程中,死锁是一个不可避免的现象。
在两种情况下,可以发生死锁现象。第一种情况是,当两个事务分别锁定了两个单独的粒度对象,
这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁。
这种死锁是最典型的死锁形式。
数据库系统原理与应用教程 (第二版 ) 第 13章 事务和并发控制 第 22页主要内容
13.1 事务
13.2 并发控制
13.3 Microsoft SQL Server系统的事务和锁
13.4 本章小结