事物的特性
1,原子性--事物中包含的所有操作要么全做,要么全部做(由恢复机制实现)
2,一致性--事物的隔离执行必须保证数据库的一致性,事物开始前,数据库保持一致性,
事物结束后仍保持一致性,(由用户来负责,由并发机制实现)、
3,隔离性--系统必须保证事物不受其他并发执行事物的影响,对任意一对事物T1,T2
要么T1在T2执行结束之前执行,要么在T1完成之后开始执行,(通过并发控制机制实
现)
4,持续性--一个事物一旦提交之后,他对数据库的影响必须是永久的
系统发生故障不能改变事物的持久性(恢复机制实现)
事物的操作组成
1,事物开始
begin transaction 事物开始
2,事务读写操作
read/write transaction 事物进行数据操作
3,事物提交
commit transaction 事务完成所有数据操作,同时保存操作结果,它标志着事物成功完成
4,事务回滚
rollback transcaction事物未完成所有数据操作,重新返回事务开始状态,标志着事物的撤销
并发操作与数据的一致性
并发操作带来数据不一致的三种情况
1,丢失修改
2,读过时数据
3,读脏数据
排它锁,共享锁
如果事务T对数据对象Y加上了排它锁,那么T即可以读取Y也可以更新Y
如果事务T对数据对象Y加上了共享锁,那么T可以读取Y,但不能更新Y
一次加锁锁住的数据大小被称为锁的颗粒
如果单元小,则该锁是 细粒度
如果单元大,则该锁是 粗粒度
封锁协议 --是对数据对象加锁,持锁和释放锁时约定的一些规则,不同的锁规则形成了不同的封 锁协议
1级封锁协议
规定事务T在事务更新数据对象之前,必须对该数据对象加排他锁,并且直到事务T结束时 才可以释放该锁
利用一级封锁协议可以防止丢失更新问题的发生
2级封锁协议
规定事务T在更新数据对象之前,必须对数据加X锁,且直到事务T结束时才可以释放该 锁,还规定事务T在读取数据对象之前必须先对其加S锁,读完后释放S锁
防止丢失更新问题,还可以防止未提交以来问题,但却不能防止不一致性分析问题
3级封锁协议
规定事务T在更新数据对象前,必须对数据对象加X锁,且直到事务T结束才可以释放该锁 ,还规定事务T在读取数据对象之前必须先对其加S锁,该S锁也必须在事务T结束才可 以释放
三级封锁协议可以防止丢失更新和未提交依赖问题,还可以防止不一致性分析问题的发生 ,但却带来了其他问题,死锁和活锁
死锁和活锁
在多个事务并发执行的过程中,可能会存在某个尽管总有机会获得锁的事务却永远也没有得到锁,这种情况称为活锁
多个并发事务处于等待的状态,其中的每一个事务都在等待他们中的另一个事物释放封锁
这样才可以继续执行下去,但任何一个事物都没有释放自己已获得的锁,也无法获得其他事物已拥有的锁,所以只好相互等待下去
封锁的预防
1,每个事物必须一次性将所有使用的数据加锁,或者必须按照一个预先约定的加锁顺序对使用到的数据加锁
2,每当处于等待状态的事务有可能导致死锁时,就不在等待下去,强行事务回滚
死锁恢复
当系统中存在死锁时,一定要解除死锁,具体的方法时从发生死锁的事务中选择一个回滚代价最小的事务,将其彻底回滚,或者回滚到可以解除死锁处,使他的事务可以获得想应的锁,而得以继续运行下去
事务Ti运行时,有唯一的时间标记,称为时戳,用Ts(Ti)表示,时标技术的基本思想是
1,每个事物开始执行时,系统为这个事物赋予一个时标,一般为当前时间,称之为启动时间,用TS(Ti)标识
2,每个事物所进行的每个读写操作,均具有时标属性
3,系统标识并保存每个有数据项Q的最近读时标R_TM(Q)和写时标W_TM(Q)
封锁机制
封锁类型
1,共享锁,非独占的,允许多个并发事务读取其锁定的资源,数据被读取后,立即释放共享锁,如:select
2,修改锁,
3,独占锁,
4,意向锁