返回顶部
首页 > 资讯 > 数据库 >Oracle 事务流程有哪些
  • 377
分享到

Oracle 事务流程有哪些

2024-04-02 19:04:59 377人浏览 薄情痞子
摘要

oracle 事务流程有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。事务表:事务表存放在undo段头部(undo段头块),每一个un

oracle 事务流程有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

事务表:
事务表存放在undo段头部(undo段头块),每一个undo段最多可以存放47个事务。
事务表按行存放事务记录,每行一个事务记录。
事务开始后,服务进程分配一个XID,将事务信息(XID UBA)存放在undo的段头块。

Oracle尽量一个事务使用一个回滚段,如果事务太多,会出现回滚段重用,多个事务使用同一个回滚段。并且Oracle会均匀的将事务分配在回滚段中。

查看当前事务信息

select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction ;
XID XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL
06001C004B040000 6 28 1099 711 3
查看所有回滚段。
SYS@prod>Select * from v$rollname;
 0 SYSTEM
 1 _SYSSMU1_3724004606$
 2 _SYSSMU2_2996391332$
 3 _SYSSMU3_1723003836$
 4 _SYSSMU4_1254879796$
 5 _SYSSMU5_898567397$
 6 _SYSSMU6_1263032392$
 7 _SYSSMU7_2070203016$
 8 _SYSSMU8_517538920$
 9 _SYSSMU9_1650507775$
10 _SYSSMU10_1197734989$
从事务信息中可以看出,当前事务使用的是6号undo段。
找到6号undo段的段头块的位置:
SYS@prod>select header_file,header_block from dba_segments where segment_name = ‘_SYSSMU6_1263032392$’;
HEADER_FILE HEADER_BLOCK
  3         208
3号文件208块就为undo段的段头块。
可以将其转储查看事务表:
Alter system dump datafile 3 block 208
select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) block,id
from t1
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) BLOCK ID
               1      91041      5
               1      91041      5
               1      91041      5
查看行数据所在数据块的位置进而转储查看数据块结构。

事务槽ITL:
事务槽存放在数据块的头部,事务修改一个数据块,需要在事务槽中记录事务信息。

XID 既是编号 又是地址。
1.使用了哪个回滚段的段头块
2.段头块使用了哪行来记录事务。
3.第几次覆盖。 (第几次循环使用)。

先简单叙述一下事务的流程:

1.开始一个事务,首先Oracle给这个事务分配XID,并找到一个回滚段,在回滚段头块将事务信息存放在事务表中,并给这个事务分配undo块,并将undo块的地址也写入事务表中(UBA地址) 。
2.事务准备修改一个数据块,在该数据块的头部的事务槽中写入事务信息(XID ,UBA(这个UBA指向相对应的undo块))。
3.开始修改数据,将数据块修改的前映像存放在undo块中。

事务表中与事务槽中的UBA是不同的:
事务表中的UBA:

事务表中的UBA是指向事务操作的最后一个undo块,同时也是事务回滚开始的位置。
rollback回滚时,根据事务表中的UBA直接定位事务回滚的起点。
并且要知道回滚块与回滚块之间是串起来。

事务槽中的UBA:
数据块中事务槽的UBA指向相对应的undo块,意义在于加快构造CR块的效率,
执行select时,服务进程如果发现该行数据正在有事务进行,且未提交,那么就会结合当前块以及undo块生成CR块(能够更加快速的找到相对应的undo块)。

事务槽中记录XID意义在于指向事务表,直接定位到事务表的位置,与Oracle提交方式有关,具体原因,后面描述。

一个DML事务开始时,需要修改的位置:
回滚段头部的事务表被修改
数据块块头部的事务槽被修改
undo块被修改
数据块的行数据被修改
(以上四种修改都会产生redo)

事务槽的数量查看:
Select ini_trans,max_trans from dba_tables where table_name = ‘T1’

事务槽的争用问题:
会话A启动第一个事务修改该数据块中的一行数据,
需要在该数据块中获取一个事务槽(未提交)
(没有提交事务槽不能被覆盖,只有事务已经提交的事务槽才可以被覆盖)

会话B启动第二个事务修改该数据块中另一行数据
也需要在该数据块中获取一个事务槽
当事务槽获取上限以后
再来一个事务修改该数据块的其他行,就需要等待事务槽释放。

解决:
可以增加pctfree减少争用
Oracle为了结局对事务槽的争用,对insert操作,Oracle会将其分布到多个块中。
但是对update 与 delete无能为力,只能增加事务槽,所以update与delete容易出现事务槽争用。

事务槽中记录XID的意义:
Oracle结合延迟块的清除实现快速提交:
如果一个事务修改了1000个块,事务信息在1001个块中存在(undo段头部块)
当事务提交时,需要在1001个块的位置将事务记录修改为已提交的状态,会很慢。

并且还可能出现一种情况事务修改了1000个块,当要提交时,已经有800个块被写入磁盘。
Oracle不可能再将这800个块重新读入磁盘,来将数据块头部事务槽中记录的事务修改为已提交状态。

Oracle延迟块清除的办法:
当事务提交时,Oracle仅更新undo段头的事务信息,根据buffer的数量,并且仅会更新部分buffer,剩余buffer Oracle会在下次读取这些数据块时清除事务记录。

所以说 数据块中事务槽记录未必准确, 如果数据块中事务槽记录的事务未提交,Oracle还需要根据事务槽头部的XID去undo段头事务表来进一步判断事务是否提交,如果undo段头事务表记录该事务已经提交,那么Oracle会选择相信undo段头,进而修改数据块,并且将上一个事务的事务槽中的事务记录修改为已提交。

Oracle的多种提交方式:
事务修改的数据块少时:
事务提交时
修改undo段头记录的事务状态
修改数据块头部事务槽中记录的事务状态
修改数据行标志(事务槽编号,指向事务槽,就是Oracle行级

事务修改的块一般多时:
事务提交时
会将undo段头的事务表以及数据块头部的事务槽中的事务状态修改为已提交。
数据行标记(行锁)会在下次select访问时清锁。
(这也是有时select也会产生redo日志的原因)

事务修改的块很多时:
当事务提交时
仅会修改undo段头的记录。
事务槽,数据行标记(行锁)在下次select访问时修改清锁。

另一种情况:
如果一个数据块长时间未被读入到buffer cache,而且数据块事务槽以及锁还未清除,如果此时读取,服务进程会去undo段头的事务表中判断事务是否已经提交,但是服务进程读取undo段头的事务表时发现,事务表已经被覆盖15次,此时Oracle会认定事务已经提交,因为事务未提交在事务表中不可能被覆盖,然后服务进程清除该数据块事务槽的记录,清除数据块行锁。

Select流程总结
(数据块中每行数据都会有指向事务槽的标记)
当客户端执行select查询时,服务进程接收请求,将符合要求的数据块读入到buffer cache中,服务进程会先去读取数据块中的行。
如果数据块的行上有事务槽标记(行锁),服务进程会去事务槽中查看该事务槽中记录的事务是否已经提交。(由于快速提交,延迟块清除原则,锁信息并不代表事务情况)
如果事务槽中记录的事务已经提交,那么服务进程会清除数据块中这行记录的事务槽标记(行锁),直接读取该行数据。
如果事务槽中记录的事务没有提交,Oracle会产生怀疑,服务进程会根据事务槽中的XID去undo段头部中的事务表中读取事务状态(事务槽中记录XID的意义)。
如果事务表中的事务状态为已提交,那么服务进程会认定这行数据所对应的事务已经提交,清空行标记,将事务槽中未提交状态修改为已提交。
如果事务表中的事务状态为未提交,那么Oracle会认定该数据块中行对应的事务未提交,此时服务进程就会根据当前块中的行数据来结合undo块来构造CR块,用于一致性读。

Update流程总结:
简单的说,就是如果该行数据有事务正在进行,那么就需要等待
如果该行数据没有事务正在进行,那么就正常修改。
Oracle两个事务可以同时修改一个数据块,只要行不冲突即可。行级锁的并发

关于Oracle 事务流程有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: Oracle 事务流程有哪些

本文链接: https://lsjlt.com/news/58557.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Oracle 事务流程有哪些
    Oracle 事务流程有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。事务表:事务表存放在undo段头部(undo段头块),每一个un...
    99+
    2024-04-02
  • javascript事件流有哪些
    javascript中的事件流有:1.冒泡型事件流,由小到大传播;2.捕获型事件流,由大到小传播;javascript中的事件流有以下两种冒泡型事件流javascript中冒泡型事件流是指事件的传播是从最特定的事件目标到最不特定的事件目标,...
    99+
    2024-04-02
  • oracle事务的特性有哪些
    原子性(Atomicity):事务整体被执行,要么全部成功,要么全部失败,不存在部分成功部分失败的情况。 一致性(Consi...
    99+
    2024-04-09
    oracle
  • oracle产生事务的方法有哪些
    这篇文章主要介绍“oracle产生事务的方法有哪些”,在日常操作中,相信很多人在oracle产生事务的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”oracle产生...
    99+
    2024-04-02
  • oracle事务处理的方法有哪些
    Oracle数据库提供了以下几种事务处理方法: 使用 COMMIT 和 ROLLBACK 语句:使用 COMMIT 语句来提交事务...
    99+
    2024-04-09
    oracle
  • Oracle中有哪些等待事件
    这篇文章给大家介绍Oracle中有哪些等待事件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. Buffer busy waits从本质上讲,这个等待事件的产生仅说明了一个会话在等待...
    99+
    2024-04-02
  • oracle事件知识点有哪些
    这篇文章主要讲解了“oracle事件知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle事件知识点有哪些”吧!一、Oracle跟踪文件  ...
    99+
    2024-04-02
  • 服务器租用的流程有哪些
    服务器租用的流程有:1、租用服务器要根据自己的实际需求选择相应的服务器硬件配置;2、租用服务器要根据网站的情况选择合适的服务器带宽;3、租用服务器要根据用户的需求去考虑服务器的可扩展性;4、租用服务器时要选择正规的服务商。具体内容如下:从实...
    99+
    2024-04-02
  • ORACLE常见等待事件有哪些
    这篇文章主要介绍“ORACLE常见等待事件有哪些”,在日常操作中,相信很多人在ORACLE常见等待事件有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ORACLE常见等待...
    99+
    2024-04-02
  • Spring事务有哪些坑
    这篇文章主要讲解了“Spring事务有哪些坑”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring事务有哪些坑”吧!一、Spring事务管理的几种方式:Spring事务在具体使用方式上可...
    99+
    2023-06-15
  • 湖南服务器托管流程有哪些
    湖南服务器托管的流程一般包括以下几个步骤:1. 确认需求:客户与托管服务商确认服务器托管的需求,包括服务器类型、配置、带宽等,以及服...
    99+
    2023-06-13
    湖南服务器托管 服务器托管 服务器
  • MySQL中有哪些流程函数
    这篇文章将为大家详细讲解有关MySQL中有哪些流程函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。流程函数是MySQL相对常用的一类函数, 用户可以使用这...
    99+
    2024-04-02
  • 域名注册流程有哪些
    1.选择域名:首先需要选择一个合适的域名,可以通过域名注册商或者WHOIS查询工具来查询域名是否已被注册。2.提交注册申请:在选择好...
    99+
    2023-06-13
    域名注册 域名
  • PHP的流程结构有哪些
    本篇内容介绍了“PHP的流程结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP有三种流程结构:1、顺序结构,程序中的各个操作是按...
    99+
    2023-07-04
  • SpringMVC的执行流程有哪些
    今天就跟大家聊聊有关SpringMVC的执行流程有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。#简易版客户发送请求经过 DisPatcherServlet 核心过滤器DisPa...
    99+
    2023-05-31
    springmvc
  • Git的工作流程有哪些
    本篇内容主要讲解“Git的工作流程有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Git的工作流程有哪些”吧!一、Git的基本概念在深入讨论Git的工作流程之前,我们先了解一些Git的基本概...
    99+
    2023-07-05
  • golang事务流程
    Golang(也称为Go)是一种由Google开发的编程语言,它专门设计用于高效、可靠的系统编程。Golang提供了内置的并发机制和协程,因此在处理并发事务时表现出色。在本文中,我们将探讨Golang的事务流程。什么是事务?在计算机科学中,...
    99+
    2023-05-21
  • oracle常见的等待事件有哪些
    本篇文章给大家分享的是有关oracle常见的等待事件有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1. Buffer busy wa...
    99+
    2024-04-02
  • golang的程序流程有哪些步骤
    golang,即Go语言,是谷歌公司开发的一门新型编程语言。它采用了现代化的语言设计,具有高效、可扩展性好、易于学习等优点,成为近年来互联网领域中备受关注的一门编程语言。在golang的基础上,我们可以开发出各种各样的应用程序和服务,支持并...
    99+
    2023-05-14
  • MySQL事务特征有哪些
    这篇文章主要讲解了“MySQL事务特征有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务特征有哪些”吧!  MySQL事务特征有哪些  At...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作