ITPub博客

首页 > 数据库 > Oracle > oracle事务知识点小结

oracle事务知识点小结

Oracle 作者:聋子的耳朵 时间:2014-02-25 17:24:41 0 删除 编辑

DML语句流程
1 获取事务锁和ITL
2 锁定候选行
3 生成redo
4 生成undo
5 生成redo record写入log buffer并更改数据块


事务提交

1 分配SCN
2 更新事务表,将事务槽状态改为0x09
3 回收undo块
4 创建commit redo record
5 将redo从log buffer刷新
6 释放表锁和行锁




一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁;


ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录;

两者区别在于:事务槽指向undo chain起始位置,而UBA指向事务最近一次改动;
 




Undo chain:同一事务的undo record形成单向链表,新生成的插入队首;

一个undo块只能由1个事务使用;
 





构造CR块

会话A对块做DML尚未提交,会话B此时读取该块则会探测到1个open ITL,检查回滚段头的事务表发现状态为active,则需构造1个CR块;
克隆当前块,通过回滚段头和回滚块撤销其最近操作;
通过x$bh.state可查看buffer状态
0 FREE no valid block image
1 XCUR a current mode block, exclusive to this instance
2 SCUR a current mode block, shared with other instances
3 CR  a consistent read (stale) block image
4 READ buffer is reserved for a block being read from disk
5 MREC a block in media recovery mode
6 IREC a block in instance (crash) recovery mode



延迟块清除
事务提交时只保证将事务槽状态改为inactive,若此时块已经不在buffer中,则ITL仍为open;
下次读取时依据事务槽信息更新ITL的flag和Commit SCN,以及释放行锁和fsc(free space credit),期间会产生redo;
有2种例外:
1 事务表槽已被重用,即wrap#>XID.wrap#,则使用回滚段头的CSCN作为upper bound SCN;
2 回滚段已删除,则用undo$中的SCN更新(ITL的flag为CU--);
http://www.laoxiong.net/about-block-delay-cleanout-and-consistent-reads.html 


快速块清除

提交时块仍在内存,更新其ITL的commit SCN(锁标志不更新)和flag(-U--),涉及的块最多达到buffer cache的10%;
若块已经同步到磁盘即状态为clean,此操作会让其重新为dirty需要二次刷新;
下次读取该块时,通过检查事务槽确认已提交,则将ITL关闭;若对应回滚段已删除,则从undo$中寻找SCN记录;



事务恢复
1 rollback
反向扫描所有的undo记录(latest first)并依次应用,ITL会随之更新;
2 进程crash
PMON负责恢复;可通过10012事件查看;
3 数据库crash
SMON负责恢复;再次启动时,优先恢复system回滚段的事务 ,先将其他回滚段事务设为DEAD,待数据库OPEN后再次扫描这些回滚段并执行回滚;
可通过x$ktuxe.ktuxecfl=’DEAD’查询死事务,其事务槽的cflags=0x10;
10013事件可跟踪数据库启动时的事务恢复;10015则dump事务恢复前后的回滚段头;
10153可禁止数据块启动时回滚死事务;



隐含参数

_offline_rollback_segments & _corruupted_rollback_segments
指定的回滚段在数据库启动时不会被扫描,其包含的active事务也不会被回滚;
若块包含open ITL指向_offline回滚段,重新读取该块时会访问事务表,若事务已提交则执行块清除,若active只可构造CR块;


http://blog.itpub.net/15480802/viewspace-763084/

http://blog.itpub.net/15480802/viewspace-696089/


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24270800/viewspace-1089129/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-02-25

  • 博文量
    2
  • 访问量
    3036