• oracle事务知识点小结


    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-1086960/

  • 相关阅读:
    使用express框架创建服务器
    搭建第一个node服务器
    Node 与JS的区别
    node学习之路
    【每天一个linux命令】read
    【每天一个linux命令】awk
    【每天一个linux命令】wc
    【每天一个linux命令】sed
    【每天一个linux命令】tee
    【每天一个linux命令】find
  • 原文地址:https://www.cnblogs.com/future2012lg/p/3866744.html
Copyright © 2020-2023  润新知