ACID特性

oracle如何使用undo和redo来保证了关系数据库的ACID特性。 ACID的特性简单描述为:

  • Atomic:以事务为单位的原子性
  • Consistency:保证数据一致性
  • Isolation:不同事务之间的隔离性,未提交的事务对其它会话是不可见的
  • Durablity:提交的事务在系统失败的情况下是可恢复的

oracle使用了redo和undo的机制来完成ACID的特性。

1, Atomic:

  当oracle更新数据的时候,会创建undo vector来保存数据的前映像。这样当不同的session访问的时候,使用undo来构建一致性读,最新的数据是不可见的,直到事务提交。

2, Consistency:

  数据更新,伴随着oracle的状态变更的整个过程,但对于最终用户来说,只会看到两种状态,老版本和提交后的新版本。而一致性的整个机制依靠undo的完成。但对oralce internal来说,最新的数据是可见的,这也是实现enqueue阻塞的基础。

3, Isolation:

  正是由于undo的可用性,保证了不同会话间不会看到更新变更的过程,而只会看到前映像的一致版本或者commit后的最终版本。

4, Durablity:

  持久化的特性,oracle使用redo的机制来完成,相比较写更新的数据块到磁盘,在commit的时候,只持久化更新的日志记录就返回完成来说,代价会大大降低,当system发生问题的时候,有这些redo就可以回放重做。 所以,undo和redo的机制完全满足了ACID的特性,不仅仅如此,还实现了performance和recoverability。

5,performance

  redo机制实现了oracle 持久化特性的同时,保证了数据更新的异步化,大大提高了事务处理能力。   undo机制实现了oralce事务的隔离,在多用户并发的场景下,实现多版本一致性的基础上,可以实现读写完全不阻塞。大大提高了并发(concurrency)能力

6,recoverability

  redo机制记录了oracle数据变更的必要日志,可以使用日志来重新放映数据的变更。

redo:

  1,redo的基本机制相对比较简单,顺序的写入变更的日志到buffer中,是事务提交或者其它条件满足的时候,把buffer中redo写入到online redo file中,当一组redo file写完了之后,就switch到下一组,如果oracle设置为归档模式,就会copy redo到archive redo file中,online redo file会被循环使用。

  2,通常情况下redo只是写入,copy就完成了,但也会有读的情况,如一些高级特性,logminer,stream,standby等。

  3,redo在9i的时候会有一个性能瓶颈,oracle会有一个共享的redo buffer,当会话产生redo change的时候,会写入redo buffer,但在大并发情况下,而oracle分配内存空间时,使用latch机制,这样在高并发高负载的系统中,这个latch(redo allocation)就变成很热的共享资源,会造成不停的重试和sleep。 在10g里,每一个session会有一个private redo buffer and in-memory undo buffer,当一个事务完成时,会一次性的申请public redo allocation latch 来copyr redo到buffer中。这样一个事务获取一个latch,而一个change仅获取一个private redo allocation latch。最后commit时,lgwr获取一个public redo allocation latch。

   4,在获得redo allocation latch之前,需要一个redo copy latch,这个latch是为了同步lgwr进程的,即在这个latch过程中,lgwr必须等待,处在log file sync的等待事件中。

undo:

  undo record主要完成:

    1,read consistency

    2,rollback changes

    3,delay block cleanout 当开启一个事务的时候,ITL entry里会记录undo的地址,当有新的undo record的时候,就更新itl里的指针,以前的指针会记录在新的undo record中,这样对一个块的更改就形成了一个undo的链表。

下面通过一个实验来看一下:

第一步:dump原始的块的内容:

SYS/SYS@ORCL>alter system dump datafile 4 block 480;

Block header dump:  0x010001e0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.029.0000012a 0x0080036a.00f3.05 C--- 0 scn 0x0000.000d6ead
0x02 0x0004.013.000000fb 0x00800054.0110.05 C--- 0 scn 0x0000.000d6a70
0x03 0x0005.00f.00000148 0x0080004c.019f.16 C--- 0 scn 0x0000.000d6ea7
data_block_dump,data header at 0xcc2c27c
................................
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1eb8
0x14:pri[1] offs=0x1e62
0x16:pri[2] offs=0x1e9c
block_row_dump:
tab 0, row 0, @0x1eb8
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 02
col 1: [ 7] 78 70 63 68 69 6c 64
tab 0, row 1, @0x1e62
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [ 7] 78 70 63 68 69 6c 64
tab 0, row 2, @0x1e9c
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 04
col 1: [ 7] 78 70 63 68 69 6c 64

第二步:更新一行的记录,观察undo record的地址。

SYS/SYS@ORCL>update test set name='xpchildxpchild' where id=2;

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01 0x0008.029.0000012a 0x0080036a.00f3.05 C--- 0 scn 0x0000.000d6ead

0x02 0x0003.01d.00000135 0x00800021.0162.13 ---- 1 fsc 0x0000.00000000

0x03   0x0005.00f.00000148  0x0080004c.019f.16  C---    0  scn 0x0000.000d6ea7

data_block_dump,data header at 0xcc2c27c
..................................
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1eb8
0x14:pri[1] offs=0x1e4d
0x16:pri[2] offs=0x1e9c
block_row_dump:
tab 0, row 0, @0x1eb8
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 02
col 1: [ 7] 78 70 63 68 69 6c 64
tab 0, row 1, @0x1e4d
tl: 21 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 03
col 1: [14] 78 70 63 68 69 6c 64 78 70 63 68 69 6c 64
tab 0, row 2, @0x1e9c
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 04
col 1: [ 7] 78 70 63 68 69 6c 64

第三步:更新这个块中的第三条记录

SYS/SYS@ORCL>update test set name='xpchildxpchildxpchildxpchildxpchild' where id=3;

Block header dump:  0x010001e0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.029.0000012a 0x0080036a.00f3.05 C--- 0 scn 0x0000.000d6ead

0x02 0x0003.01d.00000135 0x00800021.0162.14 ---- 2 fsc 0x0000.00000000

0x03   0x0005.00f.00000148  0x0080004c.019f.16  C---    0  scn 0x0000.000d6ea7

data_block_dump,data header at 0xcc2c27c
..................
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1eb8
0x14:pri[1] offs=0x1e4d
0x16:pri[2] offs=0x1e23
block_row_dump:
tab 0, row 0, @0x1eb8
tl: 14 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 02
col 1: [ 7] 78 70 63 68 69 6c 64
tab 0, row 1, @0x1e4d
tl: 21 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 03
col 1: [14] 78 70 63 68 69 6c 64 78 70 63 68 69 6c 64
tab 0, row 2, @0x1e23
tl: 42 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 04
col 1: [35]
78 70 63 68 69 6c 64 78 70 63 68 69 6c 64 78 70 63 68 69 6c 64 78 70 63 68
69 6c 64 78 70 63 68 69 6c 64

最后再看一下undo块的内容

xid: 0x0003.01d.00000135  seq: 0x162 cnt: 0x14  irb: 0x14  icl: 0x0   flg: 0x0000

 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
---------------------------------------------------------------------------
0x01 0x1f70 0x02 0x1ef8 0x03 0x1e80 0x04 0x1e3c 0x05 0x1dbc
0x06 0x1d5c 0x07 0x1ce4 0x08 0x1c6c 0x09 0x1bf4 0x0a 0x1bb0
0x0b 0x1b30 0x0c 0x1ad0 0x0d 0x1a58 0x0e 0x19e0 0x0f 0x1994
0x10 0x18e4 0x11 0x1880 0x12 0x182c 0x13 0x178c 0x14 0x172c
*-----------------------------
* Rec #0x13 slt: 0x1d objn: 52634(0x0000cd9a) objd: 52634 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x00800021.0162.10 ctl max scn: 0x0000.000d60d3 prv tx scn: 0x0000.000d6156
txn start scn: scn: 0x0000.000dc9ae logon user: 0
prev brb: 8388655 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0004.013.000000fb uba: 0x00800054.0110.05
flg: C--- lkc: 0 scn: 0x0000.000d6a70
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010001e0 hdba: 0x010001db
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 10
ncol: 2 nnew: 1 size: -7
col 1: [ 7] 78 70 63 68 69 6c 64 *-----------------------------
* Rec #0x14 slt: 0x1d objn: 52634(0x0000cd9a) objd: 52634 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x13
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01

op: C uba: 0x00800021.0162.13

KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010001e0 hdba: 0x010001db
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 10
ncol: 2 nnew: 1 size: -28
col 1: [ 7] 78 70 63 68 69 6c 64

总结:itl中的undo block address发生了变更,从0x00800021.0162.13变为0x00800021.0162.14。 在从undo块中,找到slot为ox14的undo record。发现op: C uba: 0x00800021.0162.13,这个代表这link的上一个undo record,找到这个undo block address,验证了我们对undo record link的理解。

checkpoint:

  redo的机制保证了数据的更新异步化,但数据更新刷入磁盘的时候是要计入checkpoint点的,这样用redo回放的时候,不用从头开始了。

Oracle core03_ACID的更多相关文章

  1. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  2. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  3. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  4. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  5. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  6. 基于Oracle安装Zabbix

    软件版本 Oracle Enterprise Linux 7.1 64bit Oracle Enterprise Edition 12.1.0.2 64bit Zabbix 3.2.1 准备工作 上传 ...

  7. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  8. 使用Oracle官方巡检工具ORAchk巡检数据库

    ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...

  9. 利用Oracle RUEI+EM12c进行应用的“端到端”性能诊断

    概述 我们知道,影响一个B/S应用性能的因素,粗略地说,有以下几个大的环节: 1. 客户端环节 2. 网络环节(可能包括WAN和LAN) 3. 应用及中间层环节 4. 数据库层环节 能够对各个环节的问 ...

随机推荐

  1. 项目由Windows2003 迁移到Windows 2008 过程,报 JS错误

    这两天在做服务器迁移,遇到了一些小的问题,现在做个粗略的记录 原服务器环境:Windows 2003 现服务器环境:Windows 2008 其中SSB项目在迁移部署后发现,报 JS的错误. 我在想除 ...

  2. win10 Administrator

    和Win7/Win8.1一样,Win10的管理员账户Administrator是默认隐藏和关闭的,因为该账户权限极高,被不法分子利用后存在极大风险.但如果你想在某些特殊情况下使用该账户,就需要手动将其 ...

  3. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  4. Ext.Net学习笔记05:Ext.Net DirectEvents用法详解

    Ext.Net通过DirectEvents进行服务器端异步的事件处理.我们在 Ext.Net用法概览 这篇中已经简单的介绍了DirectEvents,今天我们将详细的介绍一下DirectEvents. ...

  5. MarkDown 格式生产类型

    -- 不默认换行, 真的结束, 包括格式设定,记得空一行. -- 学习参考地址如下, 讲的不好, 太复杂, 不适合新手. 有好读的更好. ** 但是江湖规矩 还是引用下吧 这是地址(http://wo ...

  6. Google Test Frame 简单使用例子

    1 序言——为什么折腾Google Test 被逼无奈的. 最近研究google开源的基于列存储的数据库查询引擎supersonic源码.初略的浏览了一遍代码,竟然没有main函数,顿时惊讶的目瞪口呆 ...

  7. (转)C++静态库与动态库

    转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...

  8. IOS 学习笔记 2015-03-20 OC-数值类型

    一 定义 在Objective-C中,我们可以使用c中的数字数据类型,int.float.long等.它们都是基本数据类型,而不是对象.也就是说,不能够向它们发送消息.然后,有些时候需要将这些值作为对 ...

  9. JNI学习总结

    JNI学习总结 标签(空格分隔): java JNI:Java Native Interface,是一种通过java调用本地方法的技术(当然也可以反过来),随着JDK版本的提升,JNI的效率也一直在提 ...

  10. ASP.NET缓存 Cache

    缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多 ...