Oracle定位行锁的数据行

背景

今天上午在查询行锁的事后发现v$lock的id1和id2,阻塞的和被阻塞的会话一样,这能说明什么?

既然是被阻塞了,那争用的应该是同一块数据,但是一个事务已经修改了,没提交数据块上还有前镜像的指针,另一个事务想要修改(这里应该修改不了那为什么id1和id2一样呢),应该是构造一致性读去读取这个地址吧?

这里计一个todo,先来看看根据行锁定位到具体是哪一个表的行数据产生了行锁。

首先id1和id2其实是和 v$trasaction 的字段相对应的

id1=xidusn+xidslot(回滚段号+回滚槽号)

id2=xidsqn(回滚槽号的覆盖次数)

后面说计算,这三个记录在数据块的 ITL,相对应的还有被修改数据的前镜像uba(回滚段地址)

uba在v$trasaction也有记录,

uba=回滚块地址(文件号+块号)+ 回滚序列号 + 回滚记录号

总结一下就是当前事务的三个xid、四个uba 和上面一一对应记录在v$trasaction

select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec from v$transaction;

思路:事务记录在块的ITL,尝试根据v$trasaction的回滚段号和块号找到发生行锁的块地址。

环境

Oracle11g

SYS@orcl> select * from v$version;BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

模拟行锁

这里用本地的一个测试表demo01数据如下:

构造行锁,修改id=2的行数据id:2 name:test2 sex:男

接下来假装不知道是这里发生的阻塞,去这行数据

会话一:

SYS@orcl> update demo01 set sex='男' where id=2;1 row updated.SYS@orcl> 

会话二

我们知道的情况下就好办了,直接找到数据块,dump下来

select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid) blocknofrom demo01where id = 2;

实验

查找行锁信息

select sn.username,sn.LAST_CALL_ET,sn.COMMAND,sn.STATUS,m.sid,sn.serial#,sn.sql_id,m.type,decode(m.lmode,0,'none',1,'null',2,'rowshare',3,'rowexcl.',4,'share',5,'srowexcl.',6,'exclusive',lmode,ltrim(to_char(lmode, '990'))) lmode,decode(m.request,0,'none',1,'null',2,'rowshare',3,'rowexcl.',4,'share',5,'srowexcl.',6,'exclusive',request,ltrim(to_char(m.request, '990'))) request,m.id1,m.id2from v$session sn, v$lock mwhere (sn.sid = m.sid and m.request != 0) --存在锁请求,即被阻塞or (sn.sid = m.sid --不存在锁请求,但是锁定的对象被其他会话请求锁定and m.request = 0 and lmode != 4 and(id1, id2) in (select s.id1, s.id2from v$lock swhere request != 0and s.id1 = m.id1and s.id2 = m.id2))order by id1, id2, m.request;

可以看到sid=427的会话在2024-12-05 10:50:42登录一直处于INACTIVE, LAST_CALL_ET:9772s,发生阻塞的数据在demo01

根据阻塞会话的 sid 就能找到v$trasaction ,有xid信息,undo 信息ubafile ubablk

selects.sid, s.serial#, s.username, t.addr taddr, s.saddr ses_addr, t.used_ublk, t.used_urec
--  , t.start_time, to_char(t.flag, 'XXXXXXXX') "0xFLAG", t.status||CASE WHEN BITAND(t.flag,128) = 128 THEN ' ROLLING BACK' END status, t.start_date, XIDUSN, XIDSLOT, XIDSQN, t.xid, t.prv_xid, t.ptx_xid
fromv$session s, v$transaction t
wheres.saddr = t.ses_addr and sid=427;

id2=2070=xidsqn

id1=262163转成十六进制4 0013

高位4=xidusn,低位0013(十六进制)=xidslot=19(十进制)

又可以得到uba

select * from v$transaction where xidusn=4 and xidslot=19 and xidsqn=2070;

uba=回滚块地址(文件号+块号)+ 回滚序列号 + 回滚记录号

3号文件 4364块

dump undo块
SYS@orcl> alter system dump datafile 3 block 4364;
System altered.
SYS@orcl> exec get_trace_name
/u01/app/oracle/diag/rdbms/orcl/orcl/trace\orcl_ora_5296.trc
PL/SQL procedure successfully completed.

dump undo 段头

根据上面的xid与v$rollname的usn关联得到段头

SYS@orcl> select name from v$rollname where usn=4;NAME
------------------------------
_SYSSMU4_1254879796$

dump undo段头

SYS@orcl> ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU4_1254879796$' XID 4 19 2070;System altered.SYS@orcl> exec get_trace_name/u01/app/oracle/diag/rdbms/orcl/orcl/trace\orcl_ora_1484.trcPL/SQL procedure successfully completed.

--bdba 表示block address hdba 代表sgment header address

--当中 bdba 表示file 4,block 94,449 , hdba 表示file 4。block 94,448

block address:

sgment header address:

找到块地址之后就可以dump数据块了

dump 数据块 <<找到行锁的数据

SYS@orcl> alter system dump datafile 1 block 94449;System altered.SYS@orcl> 
SYS@orcl> exec get_trace_name/u01/app/oracle/diag/rdbms/orcl/orcl/trace\orcl_ora_6708.trcPL/SQL procedure successfully completed.SYS@orcl> 

得到dump的块,想得到被锁住的行数据 一是在数据区找到真正的数据(还没学会bbed)二是在尾区找,我们来找一下:

dump的一段内容:

block_row_dump:

tab 0, row 0, @0x1c57 ----第一个表第一行的位置 ,定义了该表在行索引中的起始插槽号

tl: 16 fb: --H-FL-- lb: 0x0 cc: 3 ----行头,tl 表示行的总长度(total length)这里是 8 个节。

--fb 表示行的标志字节(flag byte),用来标识行的状态。D表示被删除,这个之前做过实验Oracle delete删除数据是否为逻辑删除、新插入数据占用的数据块位置实验 - 墨天轮

--cc:3 -表示有列数,这个表有三个字段。

col 0: [ 2] c1 02 --第一行的第一个字段长度和值

--表示第 0 列的内容是一个长度为 2 的值,十六进制为 c1 02

col 1: [ 5] 74 65 73 74 31 --同理第一行的第二个字段长度和值

--表示第 1 列的内容是一个长度为 5 的值,十六进制为 74 65 73 74 31

col 2: [ 3] e5 a5 b3

tab 0, row 1, @0x1c67

tl: 16 fb: --H-FL-- lb: 0x2 cc: 3 <<< ----lb: 0x1 说明事物在该数据行上的锁还没清除,并且该锁指向 02 号事物槽如下图。

col 0: [ 2] c1 03

col 1: [ 5] 74 65 73 74 32

col 2: [ 3] e7 94 b7

通过UTL_RAW转化一下,就可以看到被锁住的表的行数据了

有意思,非常有意思,实验室参考下面的文章做的,刚吸收一点点,我在去学习一下。

参考:

oracle回滚机制深入研究 - ldxsuanfa - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487838.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣-图论-8【算法学习day.58】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

jenkins安装(jdk1.8已安装)

1. 下载对应jenkins版本 https://mirrors.jenkins.io/war/ 2. 上传至服务器目录并启动 mkdir -p /root/jenkins cd /root/jenkins 上传文件 启动&#xff1a;nohup java -jar jenkins.war --httpPort9090 &> jenkins.log & 访问&#xff1a;http://ip:9090 选…

异步操作、Promise和axios

1.Javascript是单线程的 什么是进程&#xff0c;什么是线程&#xff1f; 进程&#xff1a;进程是操作系统分配资源和调度的基本单位。它是一个程序的实例&#xff0c;包含了运行程序所需的代码和数据以及其它资源。 线程&#xff1a;线程是进程中的实际运行单位&#xff0c;也是…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

基于视觉的3D占用网络汇总

综述文章:https://arxiv.org/pdf/2405.02595 基于视觉的3D占用预测方法的时间线概述: 自动驾驶中基于视觉的3D占用预测的分层结构分类 2023年的方法: TPVFormer, OccDepth, SimpleOccupancy, StereoScene, OccupancyM3D, VoxFormer, OccFormer, OVO, UniOcc, MiLO, Multi-…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…

IO进程 学习笔记

……接上文 fputs&#xff08;输入字符串&#xff09; int fputs(const char *s, FILE *stream);功能&#xff1a;向指定文件中输入一串字符参数&#xff1a;s:输入字符串的首地址stream&#xff1a;文件流指针返回值&#xff1a;成功返回输出字符个数失败返回EOF文件指针偏移函…

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

支付宝租赁小程序助力便捷生活新方式

内容概要 支付宝租赁小程序为现代人带来了许多惊喜&#xff0c;它不仅仅是一个简单的租赁平台&#xff0c;更是生活中不可或缺的好帮手。想象一下&#xff0c;无论你缺少什么&#xff0c;从工具到家居用品&#xff0c;只需轻轻一点&#xff0c;便能轻松找到需要的物品。这个小…

springboot413福泰轴承股份有限公司进销存系统(论文+源码)_kaic

摘 要 使用旧方法对福泰轴承股份有限公司进销存系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在福泰轴承股份有限公司进销存系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不…

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…

C++作业3(类)

1、思维导图 2、类中存在引用成员情况下有参构造 #include <iostream>using namespace std; class Cy {float &r; public:Cy(float &r):r(r){cout<<"类中存在引用成员情况下有参构造"<<endl;};float set_r(float);void show(); }; float…

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令&#xff1a;动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后&#xff0c;进入夸克网盘app即可保存&#xff08;如果复制到夸克app没有跳转资源&#xff0c;可以复制粘贴口令到夸克app的搜索框也可以打开&#xff08;不用点搜索按钮&#…

定制链接类名,两类跳转传参,vue路由重定向,404,模式设置

router-link-exact-active 和 router -link-active两个类名都太长&#xff0c;可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中&#xff0c;建立关联…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步&#xff0c;它通过去中心化的理念重新定义了数字世界。与传统的Web2相比&#xff0c;Web3将数据主权交还给用户&#xff0c;让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念&#xff0c;去中心化应用&#xff08;D…

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候&#xff0c;发现卡片越来越多&#xff0c;有时候要找到某一张来看看笔记要找半天&#xff0c;于是自己做了一个搜索功能&#xff0c;先看效果&#xff1a; 怎么样&#xff0c;是不是还挺不错的&#xff0c;那么这篇文章就讲讲这样一个搜索…