oracle并发与多版本控制

oracle · 浏览次数 : 0

小编点评

本文主要讨论了数据库中的并发控制、多版本控制和事务的作用及隔离级别,并重点分析了Oracle的多版本控制机制。通过举例说明和案例分析,阐述了多版本控制机制在实际应用中的作用和可能出现的问题。 1. **相关概念**:本文首先介绍了并发控制的概念,这是数据库管理中非常重要的部分,用于处理多个用户同时查询或操作数据的情况。接着,文章讨论了多版本控制,这是Oracle提供的一种机制,使得在一个时间点读取表数据时,能够保证数据的一致性。最后,文章解释了事务的作用,即事务使数据库从一个一致性状态转变为另一个一致性状态。 2. **事务的隔离级别**:文章进一步探讨了并发访问可能导致的三种现象:脏读、不可重复读和幻读。为了应对这些问题,定义了事务的四种隔离级别:读未提交、读已提交、可重复读和可串行化。每种隔离级别都有其特定的含义和用途。 3. **Oracle多版本控制机制**:本文详细阐述了Oracle多版本控制机制的工作原理。通过举例说明,展示了当一个事务修改数据时,其他事务如何通过复制数据块并使用undo信息进行回滚,以保持数据的一致性。同时,文章也讨论了长时间的查询可能导致I/O异常,以及Oracle如何处理这种情况。 4. **Oracle重启动**:最后,文章通过案例分析,探讨了Oracle重启动现象。当一个事务修改了另一个事务中未提交的数据时,当前事务会阻塞,直到那个事务提交。这个过程中,如果另一个事务提交了,当前事务需要重新执行SQL语句,这就涉及到了数据的回滚和重启动问题。

正文

1 相关概念

1.1 并发控制

数据库对多个用户同时查询或者操作数据的管理。

1.2 多版本控制

oracle能物化多个版本的数据,使在一个时间点读一个表,保证在这个时间点读到的表数据是一致的。oracle的多版本控制机制是oracle提供读一致性的基础。

1.3 事务的作用

事务使数据库从一种一致性状态转变为另外一种一致性状态。

2 事务的隔离级别

并发访问可能导致的三种现象。

  • 脏读:读到别的事务中没有提交的数据
  • 不可重复读:一个时间点读取到的一行数据和在另外一个时间点读到同一行的数据不一致。
  • 幻读:一个时间点读到的数据的行数,同样的查询条件在另外一个时间点读取,发现行数增加了。
    根据并发访问可能导致的三种现象,定义事务的4种隔离级别

    读未提交:可以读取别的事务中未提交的数据
    读已提交:不能读取别的事务中未提交的数据,只能读取别的事务中已提交的数据
    可重复读:保证不同时间点读取同一行数据,数据不会发生变化
    可串行化:同样的查询条件,不同的时间点查询,数据和数据量都不会发生变化

3 oracle多版本控制机制

3.1 举例说明多版本控制机制

假设我们要查询这么一个表
select sum(account_balance) from accounts;
假设在查询开始前,数据如图7.2所示

SELECT语句开始执行,读取第1行、第2行等。在查询中的某个时刻,一个事务将$400.00从账户123转到账户987。这个事务完成了两个更新, 但是并没有提交。现在的数据表如图7-3所示。

此时发生更新的两行数据已被锁定,如果有人试图更新这两行,该用户就会被阻塞。
我们执行的查询要访问一个数据块,这个数据块中包含表最后已锁定的行(第34023行), 此时它应该会发现这一行中的数据在此查询开始执行之后有所改变。为了提供一个一致的答案,Oracle在这个时刻会复制这个块的数据到数据库高速缓存,然后根据undo数据回滚复制的块的数据,回滚到刚开始查询那一刻这个块已提交的数据。然后就可以读取到开始查询那一刻的数据(100),而不是读取修改后的数据(500)。这样统计出来的数据就能保证一致性。

3.2 长时间的查询导致I/O异常

一个耗时很长的SQL可能会导致I/O上升的非常高,因为这个sql在查询后面的块时,因为时间已过去很久,所以这些块很可能已经被别的事务修改过,oracle需要复制这些块,使用undo信息回滚这些复制的块,是复制的块的数据回滚到刚开始查询的样子。而复制和回滚的操作可能需要I/O获取。而且,如果undo信息已过期,即oracle无法根据undo信息回滚,就会报'ORA-1555 snapshot too old'的错误。

3.3 oracle重启动

重启动是指当前事务修改另外一个事务中没提交的数据,当前事务会阻塞,直到另外一个事务提交。另外一个事务提交后,当前事务执行sql,但是数据已经修改。所以当前事务会回滚这个sql再重新执行一遍sql。
重启动现象的案例:https://blog.51cto.com/webseven/1590985

与oracle并发与多版本控制相似的内容:

oracle并发与多版本控制

1 相关概念 1.1 并发控制 数据库对多个用户同时查询或者操作数据的管理。 1.2 多版本控制 oracle能物化多个版本的数据,使在一个时间点读一个表,保证在这个时间点读到的表数据是一致的。oracle的多版本控制机制是oracle提供读一致性的基础。 1.3 事务的作用 事务使数据库从一种一致

实现并发新高度:23ai的无锁列值保留

Oracle Database 23ai支持Lock-Free Reservation,中文通常译为“无锁列值保留”。 本文将通过3个部分来阐述Lock-Free Reservation的这个特性: 1.应用场景 2.实现原理 3.使用限制 1.应用场景 Lock-Free Reservation这

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

Oracle process/session/cursor/tx/tm的简单学习

Oracle process/session/cursor/tx/tm的简单学习 Oracle的部署模式 Oracle安装时有专用模式和共享模式的区别 共享模式(Shared mode): 在共享模式下,会话可以同时读取数据库的数据,多个会话可以并发地进行读取操作。 这意味着多个会话可以共享相同的数

[转帖]create table INITRANS参数分析

https://www.modb.pro/db/44701 1. 内容介绍 Oracle数据库create table时使用INITRANS参数设置数据块ITL事务槽的数量,确保该数据块上 并发事务数量。参数内容总结如下, 1. Oracle 8K blocksize 数据块初始 2个itl,8K

[转帖]ORACLE 并行(PARALLEL)实现方式及优先级

http://blog.itpub.net/25542870/viewspace-2120924/ 一、 Parallel query 默认情况下session 是ENABLE状态 1. 实现方式 1 Alter session force parallel query; 2 Alter table

[转帖]Python连接Oracle数据库进行数据处理操作

https://www.dgrt.cn/a/2259443.html?action=onClick 解决以下问题: Python连接Oracle数据库,并查询、提取Oracle数据库中数据? 通过Python在Oracle数据库中创建表 Python数据插入到Oracle数据库中? Python删除

oracle导入导出某个schema数据

# 背景 公司之前部门拆分,但一些服务并没有拆分清楚。其中一个老服务,两个部门都在用,现在为了避免互相影响,决定克隆该服务。克隆就要克隆全套,当然也包括数据库,我们这个老服务,用的oracle,所以,就涉及到从旧的oracle中导出数据,然后再导入到另一套新的oracle实例中。 届时在线上肯定是要

ORA-01008:并非所有变量都已绑定-解决办法

近期批量处理数据,后台用JAVA编写,连接Oracle数据库,程序运行报ORA-01008问题。解决这个问题时遇见的坑较多,下面复盘现象、问题提出解决办法,希望能帮到遇见同类问题的你。 调试问题: 后台代码: /** * 插入操作的封装 * **/ public static void insert

Oracle JDK 和 OpenJDK 有什么区别?

摘自 JavaGuide (「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!) 可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异