写作目的:为了应对考研复试中的面试,我整理了导师可能提问的地方,力求用口语化的语言描述出来。
这只是一部分,陆续还有数据库原理的其它章节,还会推出数据结构、计算机网络、数据库的复试题整理。
数据库原理我的参考书是《数据库原理及应用第二版(雷景生)》,因为一些机缘巧合选择了这本书。不过没关系,网上有很多关于数据库原理的面试题,而且答案也很容易搜到。思维导图在我的processon。如果对你有帮助就打赏一下吧。
https://www.processon.com/view/link/5e7e0107e4b027d999d2cb1d
还有其它系列的面试题整理
考研复试计算机组成原理面试题
考研复试操作系统面试题
目录
事务的定义和事务的四大特性?
事务的五种状态?
数据不一致的情况?
什么是共享锁和排它锁
描述三级封锁协议
解释什么是死锁和活锁
死锁如何检测和预防
什么是事务的可串行化
描述两段锁协议
什么是隐式封锁和显示封锁
为什么要引入意向锁
插入、删除对并发控制的影响应该如何解决?
什么是插入元组现象?如何解决呢
故障的种类和恢复方法
描述数据转储技术
使用日志的数据库恢复技术
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 原子性保证了事务的一致性。
2、一致性(Consistency):要求事务执行完成后,将数据库中一个一致性状态变为另一个一致性状态。所谓的一致性状态时指数据库中的数据满足完整性约束,它是一种以一致性规则为基础的逻辑属性。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 即使有多个事务并行执行,结果就像每个成功的事务按串行调度执行一样,又叫可串行性,
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
活动状态、局部提交状态、失败状态、异常终止状态、提交状态
局部提交状态:事务虽然执行完了,但对数据库的修改可能还在缓冲区当中。
失败状态:活动状态的事务还没有执行到最后一个语句,或者局部提交状态的事务遇到了故障。
更新丢失、不可重读、污读
更新丢失:两个事务同时读取了一个数据对象并修改,前一个事务的结果被后一个事务的结果覆盖。
不可重读:事务T1读取数据后,事务T2执行更新操作,T1无法重现前一次的读取结果。包括三种情况:(1)T1读取某数据,T2进行了修改,T1再次读取得到了不同的值。(2)T1读取了某些记录,T2删除了其中的一部分,当T1再以相同的条件读取时,与前一次结果不一致。(3)T1读取某些记录,T2添加了几条记录,当T1再以相同的条件读取时,与前一次结果不一致。
污读:T1修改了数据后,并将它写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,数据回滚。这时T2读取到的数据与数据库中的不一致,T2读的就是脏数据。
排他锁(X):又叫写锁,如果某对象加上排他锁,他就可以对这个数据对象进行读写,而其他的事务不能对这个数据对象加锁。
共享锁(R):读锁。加上这个锁,事务只能对这个对象读取,而不能修改。其他的事务也可对这个对象加上共享锁。
一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。2级封锁协议除防止了丢失修改,还可进一步防止读"脏"数据。
三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。3级封锁协议除防止了丢失修改和不读'脏'数据外,还进一步防止了不可重复读。
活锁:事务在执行过程中有机会获得锁,但却用于无法获得锁。解决方法是先来先服务。
死锁:两个或两个事务等在互相等待状态,他们都等待其中一个事务节解除封锁,否则都无法执行。
检测:超时法,设置时间,超过则死锁;等待图法,如果图中有回路,这就是死锁。
预防:一次封锁法,事务一次性对要使用的属于对象加锁,不加锁就不能运行;顺序封锁法,预先对数据对象规定一个封锁顺序,所有的事务都按照这个封锁顺序来。
多个事务并发执行时,当且尽当结果与某一次顺序串行执行的结果相同,称这种调度为可串行化调度。可串行化调度是并行调度正确的唯一准则。
协议规定(1)对任何数据读写之前,必须要获得该数据的封锁;(2)释放了一个锁之后,事务不能再获取其它的封锁。第一阶段只获得锁,第二阶段只释放锁。
两段锁协议可以保证事务的可串行化,是充分条件。
多粒度树中的每个结点都可以被独立的加锁,对这种结点的封锁被称为显式封锁,对一个结点加锁意味着这个结点的所有后裔结点也被加了同样类型的锁,这些后裔结点的封锁方式就是隐式封锁。
意向锁的含义是 如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任意结点加锁时,必须对它上层结点加意向锁。这样的好处是,要确定某事务是否可以对某结点加锁,不需要搜索整个粒度树,只需要搜索从根到这个结点的路径,看一下要加的锁和路径上的锁是否相容。这样做提高了系统的并发度,减少了加锁和解锁的开销。适用于两种类型事务的混合运行:(1)只存取很少小粒度数据项的短事务;(2)存取一个或一组完整数据库文件的长事务。
事务T遵循的对多粒度树结点Q的加锁规则:
必须遵循锁相容矩阵;
粒度树的根必须首先被加锁,锁的类型不限;
当Q的父节点被T加上IX或IS时,Q才可以被T加上S或IS型锁。
当Q的父节点被T加上IX或者SIX,Q才可以被T加X、SIX或IS锁。
当T还没有释放任何锁,T才可以对结点加锁
当Q的所有后裔结点都不被T加锁,T才可以解锁Q。
在删除一个数据项之前,该数据项必须被加上排它锁。
重点分析insert的影响。两个事务T1 T2,他们要操作同一个对象元组Q
T1执行insert(Q)Q是一个元组。
1、T2执行insert(Q),如果主键冲入则会出错,如果主键设置自增就不会出错
2、T2执行delete(Q),如果T1先于T2执行,就可以成功,否则因为没有输出删除就失败
3、T2执行write(Q),如果T1比T2执行早,可以成功,如果T2先执行则可以修改成功
4、T2执行read(Q),如果T1比T2执行早,可以成功,否则失败
批注一下:这种现象的出现有个前提,就是只有S锁和R锁,没有使用意向排他锁。
如果有意向排他锁就没有这种现象了。
插入元组现象有点类似于不可重复读的三种现象之一
描述:T1查询整个R的数据,同时T2往R中插入一个元组。会出现两种冲突情况
1、T1使用了T2插入的值,等于先执行T2后执行T1的串行操作
2、T1没有使用T2插入的值
为什么会导致这种现象,因为并发控制协议在元组粒度级别。
解决办法:
1、提高并发控制粒度,将元组级别提高到关系级别。
2、索引锁技术,及每个关系必须加一个索引,任何事务要插入元组到一个关系,它必须要插入信息到关系的索引里。其本质是将插入元组引起的冲突转化为索引数据块引起的冲突。
索引协议规则:
1、一个关系至少一个索引
2、索引数据块加锁后关系才能加锁。
3、没有更新关系R的所有索引,事务T不能向关系R插入数据
4、必须遵循两段锁协议
1,事务故障及其恢复:事务故障表示由非预期的、不正常的程序结束所造成的故障。造成程序非正常结束的原因包括输人数据错误、运算溢出、违反存储保护、并行事务发生死锁等。发生事务故障时,被迫中断的事务可能已对数据库进行丁修改,为了消除该事务对数据库的影响,要利用日志文件中所记载的信息,强行回滚该事务,进行undo操作,将数据库恢复到修改前的初始状态。
2、系统故障:系统故障是指系统在运行过程中,由于某种原因,造成系统停止运转,致使所有正在运行的事务都以非正常方式终止,要求系统重新启动。引起系统故障的原因可能有硬件错误(如CPu故障、操作系统)或DBMS代码错误、突然断电等。
系统故障发生后,对数据库的影响有以下两种情况。(1)一些未完成事务对数据库的更新已写入数据库,这样在系统重新启动后,要undo所有未完成的事务末完成事务。(2)有些事务处于部分提交状态,进行redo操作。
3、介质故障:介质故障是指系统在运行过程中,由于辅助存储器介质受到破坏,使存储在外存中的数据部分或全部丢失。恢复时需要装入数据库副本。
根据转储时系统状态
1、静态转储;停止数据库中所有事务进行转储操作。
2、动态转储:可以运行事务并转储,但要在转储期间要记录数据活动的日志。恢复时通过日志和副本共同恢复。
根据转储量
1、海量转储,一次性转储全部数据。
2、增量转储,只转储更新过的数据,适用于更新频繁的系统。
推迟更新技术和即时更新技术
推迟更新技术协议:每个数据到达提交点之前不能更新数据库;一个事务的所有更新操作对应的日志记录写入永恒存储器之前,该事务不能到达提交点。
即时更新技术协议:所有“更新类型”的日志记录安全地存储到永恒存储器之前,事务T不能更新数据库,且不允许事务T提交。