目录

一、同一事务

二、可串行化调度

三、冲突可串行化调度

四、冲突可串行判别算法

五、参考


一、同一事务

Ri(x):表示事务 Ti 读 x

Wj(x):表示事务 Tj 写 x

什么是同一事务:只要下标一样就是同一事务。比如说 Ri(x)Wi(x) 都是Ti事务,该事务包括一次读一次写操作。记住,不在乎读写操作谁在前,只要下标一样,其实就是同一事务。

实例1, 串行调度:

该调度操作很多,操作数据也有A、B两种,但可以看到前面一部分操作都是 事务,后面一部分都是 事务,该调度就是串行调度

实例2,什么样的调度不是串行调度?

可以事务执行的次序 T1 -> T2 -> T1 -> T2,事务T1不是一次性执行完的,中间还插入了一个事务T2,这种执行方式就叫交叉并发执行,而不是串行执行的。

二、可串行化调度

一个调度是正确的有两种情况:

本身就是一个串行调度,如实例1

是一个可串行化调度。调度比较复杂,如实例2,但它的执行结果与某一次序串行调度的结 果一致时就行。

这里某一次序包括 两种。只要原结果与这两种中一个相同就行。

当有三个事务时,有123、132、213、231、312、321共六种次序。

注意这里指的次序是事务的次序,而一个事务内部很多操作,这些内部操作的次序是不能改变的,原因后面再说。

对于非串行调度,我们通过与每一种次序结果的比较,得出该调度是不是可串行调度,也就是该调度是不是正确的。

这时候就有小伙伴要提出:这样一个一个比较是不是太繁琐了?的确,所有又提出了冲突可串行化调度的概念。

三、冲突可串行化调度

提醒一下:王珊老师的《数据库系统概念》中冲突的类型没有写第一种,所以事务内部两个操作的顺序是不能换的

也就是说原调度只要交换两个事务不冲突的操作,如果能转化为一个串行调度,那么为冲突可串行化调度,即是正确的调度。

例如:实例2通过交换次序转化为实例1,实例2就是一个冲突可串行调度。

注意:

这里调度L1和L2对X的结果其实都是决定于,即使L2不满足冲突可串行化,但在最后面起决定作用,所以调度L2也是正确的。

这时候又有小伙伴要提出了:做题的时候我不管怎么交换次序也得不到,我不能说由于我没有找到,所以它就不是冲突可串行化调度?的确,我们要知道怎么证明调度是非冲突可串行化调度。

四、冲突可串行判别算法

我们重点分析一下实例2:

所以,我们拿到一个调度,你就直接画有向图,根据有向图进行判断。

留个例题,欢迎大家留言:

五、参考:

b站 哈尔滨工业大学-数据库系统(上+中+下)P235https://www.bilibili.com/video/BV1PJ411F78b?p=236&vd_source=638f399bdd78ea702c3b0541b704e044可串行化 冲突可串行化 判断方法_bijingrui的博客-CSDN博客_冲突可串行化https://blog.csdn.net/bijingrui/article/details/105479502