part1:事务的概念
1.事务:是访问并可能更新各种数据项的一个程序执行单元。通常由高级数据操纵语言或者编程语言书写的用户程序的执行所引起,并用形如begin transaction 和end transaction 的语句来界定。事务由事务开始和事务结束之间执行的全体操作组成
1.对事务的四个属性:acid
原子性:事务的所有操作在数据库中要么全部正确反映出来要么全部补反映(实现原子性:数据库系统在磁盘上记录旧值,如果事务没有执行,旧值将会恢复)
一致性:事务的隔离执行保持数据库的一致性(举个例子,a有100块,b有200块,不管他们之间怎么赚钱,共和应该是300)
隔离性:尽管多个事务可以并发执行,但每个事务都感觉不到系统中有其他任何事务在并发的执行。
持久性:一个事务成功完成之后对数据库的改变必须是永久的。(实现持久性:事务做的更新在事务结束前已经写入磁盘;有关事务已经执行的更新和已经写到磁盘上的更新的信息必须充分,能让数据库在系统出现故障之后重新启动时重新构造更新)
part2:事务的状态
1.没有顺利执行的事务叫做中止事务
2.中止事务对数据库所做的任何改变必须撤销,以保证原子性
3.一旦中止事务造成的变更被撤销,我们就说事务已回滚
4.成功完成执行的事务称为 已提交事务
5.撤销已提交事务所造成影响的唯一方法是执行一个补偿事务。
6.事务必须处以一下状态之一:
活动状态
部分提交状态
失败状态
中止状态:已经回滚了,数据库已经恢复了
提交状态
7.事务进入中止状态后有两种选择:重启事务(软硬件错误)和杀死事务(事务内部的逻辑造成的错误)
part4: 并发执行
1.多个事务并发更新数据容易引起数据一致性的问题
2.什么情况下考虑并发:
a.一个事务由多个步骤组成:cpu和io操作可以并行,有效增加系统的吞吐量和磁盘利用率
b.如果各个事务是针对数据库的不同部分进行操作,事务并发执行会更好,这样各事务可以共享cpu周期和磁盘存取,减少平均相应时间
3.系统通过称为 并发控制机制的各种机制来控制事务之间的相互影响
4.n个事务的事务组,共有n!个有效的串行调度,并发会大于这个数
5.执行顺序叫做调度,表示指令在系统中执行的时间顺序。一组事务的一个调度必须包含这一组事务的全部指令
part5:可串行化
1.冲突可串行化
read & read 唯一一个,两条指令的执行顺序无关紧要
read & write
write & read
write & write
当分别属于Ti Tj的两条指令Ii Ij在相同的数据项上面操作,并且至少其中一个是write指令的时候,我们认为他们是冲突的
如果调度s可以经过一系列非冲突指令交换转换成s',我们称s与s'是冲突等价的
称一个调度s是冲突可串行化的是指该调度与一个串行调度冲突等价
有可能存在两个调度,他们产生相同的结果,但他们不是冲突等价的-----》所以说存在着比冲突等价定义限制松一些的调度等价定义,对于系统来说,应该分析不同调度进行的计算,而不只是分析他们的读写操作。
2.视图可串行化
考虑比冲突等价限制要宽松的一种等价形式,但一样基于事务的read和write操作。
两个调度s和s',事务集相同,若满足下面三个条件,则是视图等价的
a.对于每个数据项q,若事务ti在调度s中读取了q的初始值,那么tj在调度s'中也必须读取q的初始值
b.对于每个数据项q,若事务ti在调度s中执行了read(q)并且读取的值是由tj产生的,则ti在调度s'中读取的值也必须是由tj产生的
c.对于每个数据项q,若在调度s中有事务执行了最后的write(q)操作,则在调度s'中该事务也必须执行最后的write(q)操作。
如果某个调度视图等价于一个串行调度,则说这个调度是视图可视化的。
冲突可串行化的调度一定是视图可串行化
但是视图可串行化不一定是冲突可串行化!!!
part6:可恢复性
1.可恢复调度
对于任何一对事务ti tj,如果ti读取了由ti所写的数据项 ,则ti先于tj提交。
2.无级联调度
因一个事务故障导致一系列事务回滚的现象叫做级联回滚
不希望发生级联回滚。。 无级联回滚应满足:对于没对事务ti tj, 如果tj读取了由ti所写的数据项,则ti必须在tj读取之前提交
part7 可串行化的判定
1.优先图:
如果优先图中有环,调度s是非冲突可串行化的
所以,要判定冲突可串行化,需要构造优先图并调用一个环检测算法。
2.如何修改可串行化的判定方法来判定视图可串行化