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/
oracle事务知识点小结的更多相关文章
- SpringBoot 系列教程之事务隔离级别知识点小结
SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...
- 【体系结构】有关Oracle SCN知识点的整理
[体系结构]有关Oracle SCN知识点的整理 1 BLOG文档结构图 BLOG_Oracle_lhr_Oracle SCN的一点研究.pdf 2 前言部分 2.1 导读和注意事项 各位技 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
- Oracle事务
Oracle事务的ACID特性 原子性Atomicity:事务中的所有动作要么都发生,要么都不发生. 一致性Consistency:事务将数据库从一种状态转变为下一种一致状态. 隔离性Isolatio ...
- 浅谈Oracle事务【转载竹沥半夏】
浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...
- Oracle事务之一:锁和隔离
Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...
- C++重要知识点小结---3
C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...
- C++重要知识点小结---2
C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...
- oracle事务和锁
数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数 ...
随机推荐
- TCP协议和UDP协议区别
tcp协议:可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:文件传输程序 udp协议:不可靠的.无连接的服务,传 ...
- 雷林鹏分享:Ruby CGI 编程
Ruby CGI 编程 Ruby 是一门通用的语言,不仅仅是一门应用于WEB开发的语言,但 Ruby 在WEB应用及WEB工具中的开发是最常见的. 使用Ruby您不仅可以编写自己的SMTP服务器,FT ...
- hdu2897找规律
又是找规律,无语了,说好的博弈呢,搞了半天的sg函数没有一点头绪 当n%(p+q)==0时,先手win,第一次取q个,以后每次,后手取k个,先手就取p+q-k个,最后,后手必取q个 当n=(p+q)* ...
- day40 数据结构-算法(二)
什么是数据结构? 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表.集合与字典等都是一种数据结构. N.Wirth: “程序=数据结构+算法” 列表 列表:在其他编程语言中称 ...
- openfalcon源码分析之Judge
openfalcon源码分析之Judge 本节内容 Judge功能 源码分析 设计优缺点 1. Judge功能 在open-falcon中,Judge模块的功能是通过从HBS上同步告警的strateg ...
- MYeclipes项目导入导出
导入: 右键,import,
- 流程设计器jQuery + svg/vml(Demo5 - 撤消与重做)
上篇完成了画线,接下来是撤消与重做. 代码:GoFlow_05.zip 演示地址:Demo 微信演示公众号: 另:Silverlight版 Silverlight版Demo
- Java 线程面试题 Top 50(转 ImportNew)
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- jenkins轻松玩玩远程windows的进程
飞测说:在持续集成的路上走了小半年,遇到的一些问题,今天来说一个折腾好几天的问题,和大家交流.我们都知道C#语言开发的,部署站点在IIS上,但是用持续集成的时候,发现经常因为w3wp进程导致文件无法覆 ...
- php session目录找不到的错误 Error session_start(): open(/var/lib/php/session error
问题来源 今天安装一个应用,发现提示 Error session_start(): open(/var/lib/php/session error,估计是找不到写不了啥啥啥. 于是我就去该路径下去看看 ...