首页 > 数据库 >oracle并发与多版本控制

oracle并发与多版本控制

时间:2024-06-17 17:34:51浏览次数:28  
标签:事务 版本控制 读取 回滚 查询 并发 oracle 数据

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,数据
From: https://www.cnblogs.com/study9196/p/18244485

相关文章

  • go语言之异步并发
    1.首先讲一下匿名函数和闭包的概念,(仔细看,其实Python代码里很好看,只不过Go语言代码有点多,看起来很复杂的感觉)packagemainimport"fmt"funcmain(){/*注意:匿名函数和闭包往往是一起出现的*///不带参的匿名函数func(){fmt.Printf("不带参数的匿名......
  • Oracle数据库ORA-12514错误消息
    引用:https://www.php.cn/faq/131370.htmlhttps://blog.csdn.net/arrowzz/article/details/17144653https://www.51969.com/post/18969077.htmlhttps://blog.csdn.net/yuan1164345228/article/details/115310827https://www.cnblogs.com/danghuijian/archive/2010/01/07/440......
  • Oracle RMAN备份和异机恢复
    引用:https://www.cnblogs.com/hftian/p/12698783.htmlhttps://www.cnblogs.com/shiguoqiang/p/11302178.htmlhttps://www.cnblogs.com/jyzhao/p/9200714.htmlRMAN备份备份策略1.每周日2点数据库全备2.每天4点备份归档以下仅为备份脚本,没有定时任务脚本准备工作查看数......
  • 并发编程理论基础——死锁初阶(四)
    使用细粒度锁可能会导致死锁        死锁:一组互相竞争资源的线程因互相等待,导致永久阻塞的现象如何产生死锁互斥,共享资源X和Y只能被一个线程占用占有且等待,线程T1已经取得了共享资源X,在等待共享资源Y的时候,不释放共享资源X不可抢占,其他线程不能强行抢占线程T1......
  • 【并发程序设计】总篇集 Linux下 C语言 实现并发程序
    11_Concurrent_Programing文章目录11_Concurrent_Programing1.进程概念进程内容进程类型进程状态2.进程常用命令进程信息命令top命令进程信息表进程优先级命令nice命令renice命令后台进程命令3.子进程创建子进程fork函数结束进程exit函数_exit函数回收子进......
  • [转]32th@深入解析C++并发编程:从多线程到现代C++并发库@20240616
    深入解析C++并发编程:从多线程到现代C++并发库你有没有想过,为什么C++在多线程并发编程方面如此强大?C++11标准的发布,为并发编程带来了哪些革命性的变化?本文将深入探讨C++并发编程背后的技术原理,带你领略现代C++并发库的强大之处。文章将结合代码片段,为你揭示C++并发编程的精髓。1.......
  • 【4】版本控制系统SVN
    版本控制系统SVN【一】SVN的基本概念SVN是subverion的简称,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发一个项目,实现共享资源,实现最终集成式的管理。SVN的作用:在项目组当中对需求规格说明书,测试用例,产品说明书,代码或者与项目......
  • 7、Oracle中的子查询
    最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。视频链接:【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用如果有侵权,请联系删除,谢谢。学习目标:描述子查询可以解决的问题。定义子查询。列出子查询的类型。......
  • 解锁Java高效并发:newFixedThreadPool深度剖析与实战
    1.引言在Java的并发编程中,线程池是一个重要的概念。而newFixedThreadPool作为Java标准库java.util.concurrent中Executors类的一个静态方法,为开发者提供了一个固定大小的线程池实现。本文旨在深入剖析newFixedThreadPool的原理、源码实现以及最佳实践,更好地理解和应用它。......
  • 6、Oracle中的分组函数
    最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。视频链接:【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用如果有侵权,请联系删除,谢谢。学习目标:了解组函数。描述组函数的用途。使用GROUPBY子句对数据分......