数据库系统事务复习

1.列出ACID特性,解释每一特性的用途

A: atomicity(原子性),要么执行事务的全部内容,要么一个都不执行。

C:consistency(一致性),如果一个事务作为原子从一个一致的数据库状态开始独立地运行,则事务结束时数据库也必须再次是一致的。这里一致的意思大致是事务操作前后,数据库的AID特性以及数据完整性约束依然保持(主码约束,参照完整性,check约束等),还有不违反现实等等特性,比如两个人转钱,不考虑手续费,两个人的金币总和应该是不变的。

I:isolation(隔离性),隔离性确保事务正常执行而不被来自并发执行的数据库语句所干扰。隔离性又分四个等级,最高等级是多个事务串行执行,先执行完事务A,再执行事务B。参考:隔离性

D:durability(持久性),即使系统能保证一个事务的正确执行,如果此后系统崩溃,结果系统“忘记”了事务,这样的话系统又需要将这个事务执行一遍(如果没有持久化的话,将不止重新执行一个事务,持久化就是将数据从内存写进数据库,维护数据库或者硬盘,比维护内存要便宜很多,因此事务引入了持久性这一特性)。因此,即使崩溃后事务的操作也必须是持久的。

2.事务从开始执行直到提交或终止,其间要经过几个状态。列出所有可能出现的事务状态序列,解释每一种状态变迁出现的原因。

在这里插入图片描述
在这里插入图片描述
事务从活动状态开始,当事务完成它的最后一条语句后就进入了部分提交状态。此刻事务已经完成执行,但由于实际输出可能阻止其成功完成,于是事务仍有可能不得不中止。接着数据库系统往磁盘上写入足够的信息,确保即使出现故障时事务所做的更新也能在系统重启后重新创建。当最后一条这样的信息写完后,事务就进入提交状态。

如果事务进入了中止状态,此时系统会有2种选择:
1.重启事务 2.杀死事务(因为事务的内部逻辑可能是错误的,继续执行没有意义)

3.解释串行调度和可串行化调度的区别

串行调度就是一个事务全部执行完之后再执行下一个事务,一个一个来。
可串行化(serializable)调度意思是在并发情况下,当前调度虽然不是串行调度,但是可以把它转化为串行调度,即当前调度的效果和没有并发执行的调度效果一样。

4.可串行化调度习题

在这里插入图片描述
a.分两种情况说明串行执行:
在这里插入图片描述

b.A和B最终结果都为1的调度:
在这里插入图片描述

c.不存在,因为T13和T14不管谁先执行,只要并发,开始read之后的结果A和B都是0,最终结果A和B都会是1

5.什么是可恢复调度?为什么要求调度的可恢复性?存在要求允许出现不可恢复调度的情况吗

懒人如我,又上截图了:
在这里插入图片描述
如果不要求调度的可恢复性,那遇到故障不就不满足数据库一致性了嘛~
当然存在不可恢复调度的情况呀,假如一个事务执行时间特别地久,你又想早点看到某个变量的值,就拿上面的图片说,T7就早早地把A给读出来了,它就是不可恢复调度的一个例子。

6.为什么数据库系统支持事务的并发执行

原因可以这样写:
1)有些事务包含I/O操作,有些事务需要访问CPU,这两个是分隔开的,可以并发执行。
2)减少等待时间,不能让事务执行时间少的一直等待事务执行长的时间执行完。

7.解释为何已提交读隔离性级别保证调度是无级联的

理解:
级联回滚:因单个事务故障导致一系列事务回滚的现象称为级联回滚(cascading rollback)。
级联回滚导致撤销大量工作,是我们不希望发生的。我们希望对调度加以限制,避免级联回滚发生。这样的调度称为无级联调度(cascadeless schedule)。
无级联调度应满足:对于每对事务 T i T_i Ti T j T_j Tj,如果 T j T_j Tj读取了先前由 T i T_i Ti所写的数据项,则 T i T_i Ti必须在 T j T_j Tj这一读操作前提交。(容易验证每一个无级联调度也都是可恢复的调度)

已提交读就是事务Ti读到的是Tj已经提交的东西,Tj不提交,Ti就不能读,这样Tj造成的错误就不会影响到Ti,因此不会造成级联回滚。

8.给出满足下面隔离性级别但不是可串行化调度的实例

在这里插入图片描述

先贴概念:
在这里插入图片描述
可重复读的理解:假如事务1对数据A进行了读写操作,那么当事务2在事务1对A进行写操作之前被开启的话(即事务2启动了),不论事务2对数据A重复进行了多少次的读取,这个A始终是事务1修改前的那个A,也就是每次读的A都不变,这就是可重复读。

当隔离性级别是可重复读时,如定义所说,另一个事务是不能更新数据的,如果这些数据在被现在的事务读取的话:
在这里插入图片描述

a.下面这个不能串行化,因为T1第二次读的A需要是T2写后的A
在这里插入图片描述

b.下面这个也不能串行化,T1读不到T2写后的A(如果是按照T1,T2这样串行化)
在这里插入图片描述

c.解释:pred_read(r,P)是读取表r中所有满足谓词P的元组,T2在T1的pred_read(r,P)后面执行,因此T1是读不到T2插入的新数据的(可重复读不阻止数据的插入,只是阻止数据的更新),但是由于T2又要对A进行写操作(A和r,P没有关系,是另外的数据),T1又要对A进行读,因此T1不能先于T2提交事务,所以T1和T2不能串行化
在这里插入图片描述

mysql8.0默认事务隔离级别是可重复读:
在这里插入图片描述
可以设置最低的隔离性级别:未提交读
在这里插入图片描述

当两个控制台会话(当前连接)都设置事务隔离性级别为 未提交读 时,其中一个事务修改了数据,另外一个事务是可以读到修改的结果的(先用set autocommit = 0 设置事务不要自动提交)
在这里插入图片描述


savepoint设置保存点的用法:
在这里插入图片描述

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值