首页 > 数据库 >PARTIII-Oracle事物管理-数据并发性和一致性

PARTIII-Oracle事物管理-数据并发性和一致性

时间:2024-09-10 11:24:15浏览次数:1  
标签:事务 PARTIII 数据库 并发 概述 Oracle 数据 一致性

9.数据并发性和一致性

本章解释了Oracle数据库如何在多用户数据库环境中维护一致性的数据。

本章包含以下部分:

  • 数据并发性和一致性的介绍
  • Oracle数据库事务隔离级别的概述
  • Oracle数据库锁定机制的概述
  • 自动锁定的概述
  • 手动数据锁定的概述
  • 用户定义锁的概述

9.1. 数据并发性和一致性的介绍

在单用户数据库中,用户可以修改数据,而不必担心其他用户同时修改相同的数据。然而,在多用户数据库中,多个同时进行的事务中的语句可以更新相同的数据。同时执行的事务必须产生有意义且一致的结果。因此,多用户数据库必须提供以下内容:

  • 数据并发性,确保用户可以同时访问数据
  • 数据一致性,确保每个用户看到的数据视图是一致的,包括用户自己的事务所做的可见更改以及其他用户已提交事务的更改

为了描述事务在并发运行时的一致行为,数据库研究人员定义了一个称为可序列化的事务隔离模型。可序列化事务在一个环境中运行,使其看起来好像没有其他用户在修改数据库中的数据。

虽然通常期望事务之间有这种程度的隔离,但在可序列化模式下运行许多应用程序可能会严重损害应用程序的吞吐量。并发运行事务的完全隔离可能意味着一个事务不能向另一个事务正在查询的表中插入数据。简而言之,现实世界的考虑通常需要在完美的事务隔离和性能之间做出妥协。

Oracle数据库通过使用多版本一致性模型以及各种类型的锁和事务来维护数据一致性。通过这种方式,数据库可以向多个并发用户提供数据视图,每个视图都与时间点一致。因为可以同时存在数据块的不同版本,事务可以读取查询所需的时间点提交的数据版本,并返回与单个时间点一致的结果。

9.1.1. 多版本读一致性

在Oracle数据库中,多版本化是指能够同时实现数据的多个版本的能力。Oracle数据库维护多版本读取一致性,这意味着数据库查询具有以下特性:

  • 读取一致性查询
    查询返回的数据是已提交的,并且与单个时间点一致。
    重要提示:Oracle数据库从不允许脏读,脏读发生在一个事务读取另一个事务中的未提交数据时。

    为了说明脏读的问题,假设一个事务在未提交的情况下更新了一个列值。第二个事务读取了更新后的脏(未提交)值。第一个会话回滚了事务,使得列值恢复为旧值,但第二个事务继续使用更新后的值,从而破坏了数据库。脏读会损害数据完整性,违反外键,并忽略唯一约束。

  • 非阻塞查询
    数据的读取者和写入者不会相互阻塞(见第9-12页的“锁定行为摘要”)。

9.1.2. 锁机制

9.1.3. ANSI/ISO 事务隔离级别

9.2. Oracle数据库事务隔离级别的概述

9.3. Oracle数据库锁定机制的概述

9.4. 自动锁定概述

9.5. 手动数据锁定概述

9.6. 用户定义锁概述

标签:事务,PARTIII,数据库,并发,概述,Oracle,数据,一致性
From: https://www.cnblogs.com/crispy-bro/p/18405956

相关文章

  • 并发编程:线程池(上)
    一、什么是线程池?顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。二、为什么要用线程池?池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、HTTP连接池等等都是对这个思......
  • 并发编程:线程池(下)
    一、线程池常用的阻塞队列有哪些?新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。不同的线程池会选用不同的阻塞队列,我们可以结合内置线程池来分析。容量为Integer.MAX_VALUE的LinkedBlockingQueue(有界阻塞队列):FixedT......
  • 并发编程:ThreadLocal
    一、ThreadLocal有什么用?通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK中自带的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类......
  • Java并发编程实战 11 | 线程活跃问题(死锁,活锁和饥饿)
    并发应用程序的“活跃度”指的是它及时执行并完成任务的能力。活跃性问题则是指程序无法最终得到预期的运行结果。相比于线程安全问题,存活性问题可能会导致更严重的后果。例如,死锁会使程序完全停滞,导致无法继续执行。常见的活跃性问题包括以下三种:1.死锁(Deadlock)死锁发......
  • 几种并发模式的实现
    常见的几个需要并发的场景,具体的实现方式asyncio异步并发importasyncioasyncdeftask(id,delay):awaitasyncio.sleep(delay)returnf"Task{id}completed"asyncdefmain():tasks=[task(1,2),task(2,1),task(3,3)]done,pending=await......
  • Oracle rownum用法
    ownum是oracle特有的一个关键字。对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个基表的时候,rownum的排序是根据insert记录的顺序显示的。例如:selectrownumrn,t.*fromempt;对于子查询,则rownum的顺序是根据子查询的查询顺序进行......
  • 高级DBA培训02:国产麒麟操作系统+Oracle11gR2安装配置
    一、高级DBA培训02:国产麒麟操作系统+Oracle11gR2安装配置:本课程大纲内容如下:(*)国产麒麟-Oracle11gR2课程环境规划(*)国产麒麟Linux操作系统安装(*)国产麒麟安装Oracle11gR2的操作系统参数配置(*)国产麒麟静默安装Oracle11gR2过程(*)国产麒麟静默配置Oracle11g监听服务(*)国产麒麟静默创建Orac......
  • 高级DBA培训04:Oracle11gR2迁移到国产麒麟操作系统(单机/RAC)
    一、高级DBA培训04:Oracle11gR2迁移到国产麒麟操作系统(单机/RAC)本课程大纲内容如下:(*)Oracle11gR2迁移到国产麒麟操作系统(单机)(*)Oracle11gR2迁移到国产麒麟操作系统(RAC)学习地址:https://edu.51cto.com/course/37405.html欢迎加入:51CTO学堂风哥大数据/Oracle/MySQL数据库学习专用QQ群:4541......
  • 二、并发编程与多线程-2.2、多线程(中)
    2.2、多线程(中)2.2.4、为什么启动线程不能直接调用run()方法?调用两次start()方法会有什么后果?答:在Java中,启动线程不能直接调用run()方法的原因是,run()方法是线程的执行体,通过调用start()方法来启动线程可以创建一个新的线程并使其运行。如果直接调用run()方法,则会在当前线......
  • [Java并发]sleep
    Thread.sleep是Java中用来让当前线程进入休眠状态一段时间的方法。调用Thread.sleep后,线程会进入“等待”状态,直到指定的时间过去,然后自动被唤醒继续执行。但Thread.sleep并不是在其他线程的干预下被唤醒的,而是依赖以下几个条件之一来结束休眠:时间到达:当指定的睡眠时间......