书摘:TOM的“Oracle 9i10g编程艺术”

7.3.1 一种会失败的常用数据仓库技术

我看到,许多人都喜欢用这样一种常用的数据仓库技术:

(1) 他们使用一个触发器维护源表中的一个LAST_UPDATED 列,这与上一章的6.2.3 节中讨论的

方法很相似。

(2) 最初要填充数据仓库表时,他们要记住当前的时间,为此会选择源系统上的SYSDATE。例

如,假设现在刚好是上午9:00。

(3) 然后他们从事务系统中拉(pull)出所有行,这是一个完整的SELECT * FROM TABLE 查询,

可以得到最初填充的数据仓库。

(4) 要刷新这个数据仓库,他们要再次记住现在的时间。例如,假设已经过去了1 个小时,现

在源系统上的时间就是10:00.他们会记住这一点。然后拉出自上午9:00(也就是第一次拉出

数据之前的那个时刻)以来修改过的所有记录,并把这些修改合并到数据仓库中。

注意这种技术可能会在两次连续的刷新中将相同的记录“拉出”两次。由于时钟的粒度所致,这是不可

避免的。MERGE 操作不会受此影响(即更新数据仓库中现有的记录,或插入一个新记录)。

他们相信,现在数据仓库中有了自第一次执行拉出操作以来所修改的所有记录。他们确实可能有所

有记录,但是也有可能不是这样。对于其他采用锁定系统的数据库来说,这种技术确实能很好地工作,在

这些数据库中读会被写阻塞,反之写也会被读阻塞。但是在默认支持非阻塞读的系统中,这个逻辑是有问

题的。

要看这个例子有什么问题,只需假设上午9:00 至少有一个打开的未提交事务。例如,假设在上午

8:59:30 时,这个事务已经更新了表中我们想复制的一行。在上午9:00, 开始拉数据时,会读取这个表中

的数据,但是我们看不到对这一行做的修改;只能看到它的最后一个已提交的版本。如果在查询中到达这

一行时它已经锁定,我们就会绕过这个锁。如果在到达它之前事务已经提交,我们还是会绕过它读取查询

开始时的数据,因为读一致性只允许我们读取语句开始时数据库中已经提交的数据。在上午9:00 第一次

拉数据期间我们读不到这一行的新版本,在上午10:00 刷新期间也读不到这个修改过的行。为什么呢?上

午10:00 的刷新只会拉出自那天早上上午9:00 以后修改的记录,但是这个记录是在上午8:59:30 时修改的,

我们永远也拉不到这个已修改的记录。

在许多其他的数据库中,其中读会被写阻塞,可以完成已提交但不一致的读,那么这个刷新过程就能

很好地工作。如果上午9:00(第一次拉数据时)我们到达这一行,它已经上锁,我们就会阻塞,等待这一

行可用,然后读取已提交的版本。如果这一行未锁定,那么只需读取就行,因为它们都是已提交的。

那么,这是否意味着前面的逻辑就根本不能用呢?也不是,这只是说明我们需要用稍微不同的方式来

得到“现在”的时间。应该查询V$TRANSACTION,找出最早的当前时间是什么,以及这个视图中START_TIME

列记录的时间。我们需要拉出自最老事务开始时间(如果没有活动事务,则取当前的SYSDATE 值)以来经

过修改的所有记录:

select nvl( min(to_date(start_time,'mm/dd/rr hh24:mi:ss')),sysdate)

from v$transaction;

在这个例子中,这就是上午8:59:30,即修改这一行的事务开始的那个时间。我们在上午10:00 刷新

数据时,会拉出自那个时间以来发生的所有修改,把这些修改合并到数据仓库中,这就能得到需要的所有

东西。

oracle serializable含义,对SERIALIZABLE隔离级别的反思相关推荐

  1. serializable接口_Java Serializable:明明就一个空的接口嘛

    01.先来点理论 对于 Java 的序列化,我一直停留在最浅显的认知上--把那个要序列化的类实现 Serializbale 接口就可以了.我不愿意做更深入的研究,因为会用就行了嘛. 但随着时间的推移, ...

  2. oracle resp_cpu含义,【原创】ORACLE 深入解析10053事件

    [原创]ORACLE 深入解析10053事件 发布时间:2020-08-09 16:47:25 来源:ITPUB博客 阅读:95 作者:kunlunzhiying 新年新说: 新年伊始,2012年过去 ...

  3. oracle raise 含义,Oracle中RAISE异常详解

    由三种方式抛出异常 1. 通过PL/SQL运行时引擎 2. 使用RAISE语句 3. 调用RAISE_APPLICATION_ERROR存储 由三种方式抛出异常 1. 通过PL/SQL运行时引擎 2. ...

  4. MySQL(InnoDB剖析):43---事务之(事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)

    ISO和ANIS SQL标准指定了4种事务隔离级别的标准,但是很少有数据库厂商循环这些标准.例如Oracle数据库就不支持READ UNCOMMITTED和REPEATABLE READ SQL标准定 ...

  5. Serializable的作用

    前两天接触到VO,DTO,entity这些概念,发现别人的代码中会有 implements serializable这个东西,之前并没有见过这种写法,就去了解了一下原因 import java.io. ...

  6. Java开发规范,不要新建一个类就实现Serializable接口

    个人网站:http://xiaocaoshare.com/ 作为一名java开发者,细节决定技术的高度和深度 一个java类什么时候需要实现Serializable接口 1.什么是Serializab ...

  7. Serializable接口

    什么是java序列化,如何实现? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是为了解决在对 对 ...

  8. 重要接口—Serializable接口

    原文作者:流氓小伙子 原文地址:java中类实现Serializable接口的原因 背景: 一个java中的类只有实现了Serializable接口,它的对象才是可序列化的.如果要序列化某些类的对象, ...

  9. java基础----IO序列化Serializable

    package com.henu.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

最新文章

  1. java通过反射,泛型将定义的对象与对象之间互转
  2. python 培训-Python培训周末班|python是什么?能干什么?
  3. java基础----Java的格式化输出
  4. (chap2 简单的Http协议) HTTP性能优化之管线化pipelining
  5. android信息中字符个数,在android中指定编辑文本中的字符数
  6. Sharepoint 2013 发布功能(Publishing features)
  7. VSCode摸鱼插件 — FreeWindow
  8. HTML/CSS水平垂直居中方法(待补充)
  9. TikZ学习笔记(二)循环
  10. UEditor编辑器保存数据到数据库
  11. anaconda怎么打开python文件_anaconda 运行.py文件
  12. pert计算公式期望值_PERT网络分析法
  13. 动态规划,计算股票最大收益
  14. 小米 12S Utra 莱卡水印生成在线工具
  15. 汇编语言TEST指令:对两个操作数进行逻辑(按位)与操作
  16. 【我们一起写框架】MVVM的WPF框架(一)—序篇
  17. 200个计算机局域网适合什么,批处理检测局域网电脑是否开机(200多台电脑,不同网段,最好按主机名称检测)...
  18. 地下通信管道的管孔都快占满了,新增光缆怎么布放?
  19. 什么是内存泄露?该怎么排查?Java内存泄漏策略
  20. wifi理论数据速率计算

热门文章

  1. 2015的读书计划和读书心得
  2. SDRAM中自刷新操作与PHY中Retention功能的关系
  3. php 油耗,百公里平均油耗差1L多,一年油费究竟差多少?
  4. \t\t植物大战僵尸游戏技巧心得 (超赞的小游戏)
  5. 2021年秋招面经分享·晶晨【数字IC设计工程师(成都)】
  6. django-simple-captcha 使用 以及添加动态ajax刷新验证
  7. thinkphp5.0+ajax异步刷新验证用户名是否存在
  8. JS 分享(微博,微信,QQ ,QQ 空间)
  9. 特殊时间,将页面整体调整成灰色
  10. ISO26262功能安全概述