文章目录
- 1.为什么要进行并发控制
- 2.事务
- 3.事务调度
- 4.冲突可串行性判别算法
1.为什么要进行并发控制
数据库存在的三种典型的不一致现象,理解不一致是怎么发生的?
- 丢失修改
- 不能重复读
- 脏读
并发控制就是通过两大类并发控制方法去解决三种不一致性
并发控制及相应的事务处理技术是DBMS的核心技术
2.事务
事务Transaction的定义
- 事务是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证
- eg:“银行转帐”事务T:从帐户A过户5000RMB到帐户B上
T: read(A);
A := A – 5000;
write(A);
read(B);
B := B + 5000;
write(B);
注:read(X)是从数据库传送数据项X到事务的工作区中;
write(X)是从事务的工作区中将数据项X写回数据库;
事务的宏观性(应用程序员看到的事务):
- 一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务
- 事务一般是由应用程序员提出,因此有开始和结束,结束前需要提交或撤消
- 在嵌入式SQL程序中,任何一条数据库操纵语句(如exec sql select等)都会引发一个新事务的开始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过commit或rollback确认的。因此Begin Transaction 和End Transaction两行语句是不需要的。
- 一个事务可处理一个数据或一条记录,如下例:
- 复杂一些的事务也可能处理一批数据或一批记录,如下例
- 一段程序语句,可能会循环执行。
执行中,由SQL语句引出事务,至Commit/RollBack结束事务,每次重复执行都将产生一个事务 - 更为复杂的事务由多条SQL语句构成
事务的微观性(DBMS看到的事务):
- 对数据库的一系列基本操作(读、写)的一个整体性执行
- 事务T例子:
read(A);
A := A – 5000;
write(A);
read(B);
B := B + 5000;
write(B); - 事务的并发执行:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则可以是交叉执行的。
事务的特性
- 由于事务在宏观上是独立完整的,在微观上是交错执行的,所以并发控制就是通过事务微观交错执行次序的正确安排,保证事务宏观的独立性、完整性和正确性。
解决三种不正确的次序安排导致的不一致性。
事务的四大特性
- 原子性Atomicity : DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做
- 一致性Consistency: DBMS保证事务的操作状态是正确的,符合一致性的操作规则,不能出现三种典型的不一致性。它是进一步由隔离性来保证的。
- 隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如两个事务T1和T2, 即使并发执行,也相当于或者先执行了T1,再执行T2;或者先执行了T2,再执行T1。
- 持久性Durability: DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。
换句话说:具有ACID特性的若干数据库基本操作的组合体被称为事务
DBMS对事务的控制
3.事务调度
事务调度(schedule):
- 一组事务的基本步(读、写、其他控制操作如加锁、解锁等)的一种执行顺序称为对这组事务的一个调度。
- 并发(或并行)调度:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则是交叉执行的
并发调度的正确性: - 当且仅当在这个并发调度下所得到的新数据库结果,与分别串行地运行这些事务所得的新数据库完全一致,则说调度是正确的。
可串行性:
- 如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的(Serializable)或具有可串行性(Serializability)
- 怎样判断一个并发调度是正确的?
(1)可串行化调度一定是正确的并行调度,但正确的并行调度,却未必都是可串行化的调度。 为什么?
(2)并行调度的正确性是指内容上结果正确性,而可串行性是指形式上,结果正确性,便于操作(如右侧图T2中的B=B-20改为B=B-0,则调度是正确的,但是不可串行化)
(3)可串行化的等效串行序列不一定唯一。
一种简单的事务调度的标记模型
- 表达事务调度的一种模型:
冲突可串行性
- 冲突
调度中一对连续的动作,它们满足:如果它们的顺序交换,那么涉及的事务中至少有一个事务的行为会改变。 - 有冲突的两个操作是不能交换次序的,没有冲突的两个事务是可交换的
- 几种冲突的情况:
同一事务的任何两个操作都是冲突的
不同事务对同一元素的两个写操作是冲突的
不同事务对同一元素的一读一写操作是冲突的
事务调度与可串行性
- 一个调度,如果通过交换相邻两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度
- 冲突可串行性 是比 可串行性 要严格的概念
- 满足冲突可串行性,一定满足可串行性;反之不然
4.冲突可串行性判别算法
并发调度的正确性:
- 当且仅当在这个并发调度下所得到的新数据库结果与分别串行地运行这些事务所得的新数据库完全一致,则说调度是正确的。
- 冲突可串行⊆可串行性⊆并发调度的正确性
若事务是冲突可串行化的,那么事务的并发调度一定是正确的 - 要想判断一个并发调度是否是正确的?就是要判断一个并发调度是否是冲突可串行化的调度。
如何判断一个调度是冲突可串行性的?
- 冲突可串行性判别算法
- 构造一个前驱图(有向图)
- 结点是每一个事务Ti。如果Ti的一个操作与Tj的一个操作发生冲突,且Ti在Tj前执行,则绘制一条边,由Ti指向Tj, 表征Ti要在Tj前执行。(边表示事务执行的先后次序)
- 测试检查: 如果此有向图没有环,则是冲突可串行化的!
- eg: