文章目录
一、SQL语句的执行过程
二、事务及其特性
1、事务的概念
事务是DBMS提供的控制数据操作的一种手段,程序员将一系列的数据库操作组合到一起,并作为一个整体进行操作和控制,以便DBMS能够提供一致性状态转换。
(1)事务的宏观性【程序员看到的事务】:
一个存取或更新程序的一次执行,或者说是一条或多条SQL语句的一次执行。
(2)事务的微观性【DBMS看到的事务】:
对数据的一系列基本操作的一个整体执行。
(3)事务的并发执行:即宏观上是并行执行的、但微观上的基本操作(读、写)是可以交叉执行的。
2、事务的特性(ACID)
(1)原子性Atomicity:事务的操作是不可分的,要么全做、要么全不做
(2)一致性Consistency:保证事务的操作状态是正确的,符合一致性操作规则,不能出现三种不一致性。
(3)隔离性Isolation:DBMS保证并发执行的事务之间不受影响。即:两个并发执行的事务T1和T2,相当于串行执行。
(4)持久性Durability:DBMS保证已经提交事务的影响是持久的,被撤销事务的影响是可恢复的。
三、并发的三种不一致性
1、丢失修改
T1和T2两个事务读取并修改同一数据,T2的提交结果破坏了T1的提交结果,导致T1的修改被丢失。
2、不可重复读*(读的是“旧”数据)*
事务T1读取数据之后,事务T2执行了更新操作,使T1无法再现前一次的读取结果。
不可重复读又包含了三种情况:
(1)事务T2对数据做了修改操作;
(2)事务T2对部分数据进行了删除操作;
(3)事务T3对数据进行了添加操作**(幻读)**
3、脏读*(读的是“新”数据)*
事务T1读取并修改数据,事务T2读到了T1修改后的数据,此时由于T1事务回滚(数据还原成原来的数据),导致T2读取的数据为“脏”数据。
四、并发控制方法
1、事务调度
- 事务的调度:一组事务的基本步骤(读、写、其他控制操作如加锁解锁等)的一种执行顺序称之为这组事务的一个调度。
- 并发(并行)调度:一组事务从宏观上是并行执行的,但其微观上是读写等多个基本操作的交叉执行。
- 调度又分为:串行调度和并发调度。
- 并发调度的正确性:多个事务在并发调度下得到的新数据库结果与这些事务在串行调度下得到的新数据库结果相同的时候,则说明调度是正确的。
【两个问题:】(1)如何判断并发调度的正确性?(2)如何产生一个正确的调度?
2、可串行性
可串行性:不论数据库的初始状态如何,一个调度对数据库状态的影响都与某个串行调度相同,说明我们的调度是可串行化的或具有可串行性。
注意:
-
可串行化调度一定是一个正确的并行调度,而正确的并行调度不一定是一个可串行化的调度。【两者的区别:】从定义的角度:事物的串行调度与并行调度的结果相同表示为正确的并行调度;而事物的串行调度和并行调度对数据库状态的影响是相同的,说明为可串行化调度。另外:调度的正确性指内容上的结果正确,而可串行性指形式上结果正确,便于操作。
-
冲突:调度中一对连续的动作满足(如果它们的顺序交换,那么涉及到的事务中至少有一个事务的行为会改变)
-
有冲突的两个事务是不可交换次序的,没冲突的两个事务是可以交换的
-
几种冲突情况:
(1)同一个事务的两个任何操作都是冲突的:ri(X),wi(Y) wi(X),ri(Y)【在同一事务T中,读写不可互换;程序员规定的】
(2)不同事务对同一个元素的两个写操作是冲突的:wi(X),wj(X)
(3)不同事务对同一个元素的一读一写操作是冲突的:wi(X),rj(X) ri(X),wj(X)【对同一个对象X,一读一写、双写都不可互换】
3、冲突可串行性
一个调度,如果通过交换相邻两个无冲突的操作,能够转换得到某个串行操作,那么该调度为冲突可串行化的调度
注意:
- 冲突可串行化是比可串行性更加严格的概念;
- 冲突可串行化的调度一定是可串行性调度,反之不然;
4、冲突可串行性判别算法
并发调度的正确性、可串行化、冲突可串行化三者之间的关系:并发调度的正确性 ⊇ \supseteq ⊇ 可串行性 ⊇ \supseteq ⊇ 冲突可串行化
判别算法:
- 构造一个前驱图(有向图)。
- 节点是每个事务 T i T_i Ti, 如果 T i T_i Ti 的一个操作与 T j T_j T