Oracle 数据库锁与阻塞分析与解决指南

news2024/12/24 20:52:58

目录

  1. 概述
  2. 锁(Lock)的概念
  3. 阻塞(Blocking)的概念
  4. 锁和阻塞的区别
  5. 查询锁和阻塞情况
  6. 预防和解决问题的策略
  7. 案例分析
  8. 总结

1. 概述

在Oracle数据库中,锁和阻塞是并发控制的关键概念。正确理解和管理它们对于确保数据一致性和提高系统性能至关重要。本文旨在提供关于锁和阻塞的全面分析,并给出相应的解决建议。


2. 锁(Lock)的概念

定义

  • 锁是一种机制,用于控制多个事务对同一数据库资源(如表、行等)的并发访问,以确保数据的一致性和完整性。

类型

  • 行级锁(Row-Level Locks):锁定单个或多个行,允许其他事务访问未被锁定的行。
  • 表级锁(Table-Level Locks):锁定整个表,阻止其他事务对该表进行某些操作(如插入、更新、删除)。
  • 模式锁(Schema-Level Locks):用于保护数据库对象结构本身,例如防止对象被修改或删除。

目的

  • 保证事务的ACID属性(原子性、一致性、隔离性和持久性),特别是在并发环境中。
  • 防止不同事务之间的冲突,比如避免“脏读”、“不可重复读”和“幻读”。

3. 阻塞(Blocking)的概念

定义

  • 阻塞是指当一个事务试图获取已经被另一个事务持有的锁时,该事务必须等待,直到前一个事务释放锁为止的状态。

原因

  • 发生阻塞是因为存在锁冲突,即两个或多个事务尝试在同一时间对相同的数据资源执行不兼容的操作(例如,一个事务持有排他锁,而另一个事务请求共享锁)。

影响

  • 阻塞会导致等待的事务暂时无法继续执行,可能降低系统响应速度,并在极端情况下导致死锁(Deadlock)。

4. 锁和阻塞的区别

特征锁(Lock)阻塞(Blocking)
定义控制并发访问的机制由于锁冲突导致的等待状态
作用对象数据库资源(如表、行、模式对象)尝试获取锁的事务
目的确保数据一致性和完整性确保事务按顺序执行,避免冲突
结果可能引起阻塞事务暂停执行,等待锁释放
解决方法使用适当的隔离级别、优化查询终止长时间等待的事务、调整应用逻辑

5. 查询锁和阻塞情况

查询当前持有锁的会话及其相关信息
SELECT 
    o.owner AS "对象所属用户",
    o.object_name AS "对象名称",
    s.sid AS "会话SID",
    s.serial# AS "会话SERIAL#",
    s.username AS "用户名",
    s.osuser AS "操作系统用户",
    s.machine AS "客户端机器名",
    s.program AS "使用的程序",
    l.locked_mode AS "锁定模式"
FROM 
    v$locked_object l
JOIN 
    dba_objects o ON l.object_id = o.object_id
JOIN 
    v$session s ON l.session_id = s.sid;
查询正在等待特定对象上释放锁的会话
WITH locked_objects AS (
    SELECT 
        l.session_id,
        o.owner,
        o.object_name,
        o.object_type,
        l.locked_mode
    FROM 
        v$locked_object l
    JOIN 
        dba_objects o ON l.object_id = o.object_id
),
waiting_sessions AS (
    SELECT 
        s.sid,
        s.serial#,
        s.username,
        s.osuser,
        s.machine,
        s.program,
        s.status,
        s.logon_time,
        s.event,
        s.seconds_in_wait,
        s.wait_class,
        s.blocking_session,
        lo.owner,
        lo.object_name,
        lo.object_type,
        lo.locked_mode
    FROM 
        v$session s
    LEFT JOIN 
        locked_objects lo ON s.blocking_session = lo.session_id
    WHERE 
        s.wait_class != 'Idle' -- 排除空闲会话
        AND s.blocking_session IS NOT NULL -- 只选择有阻塞会话的记录
)
SELECT 
    ws.sid AS "等待会话SID",
    ws.serial# AS "等待会话SERIAL#",
    ws.username AS "等待会话用户名",
    ws.osuser AS "操作系统用户",
    ws.machine AS "客户端机器名",
    ws.program AS "使用的程序",
    ws.status AS "会话状态",
    ws.logon_time AS "登录时间",
    ws.event AS "等待事件",
    ws.seconds_in_wait AS "等待时间(秒)",
    ws.wait_class AS "等待类别",
    ws.blocking_session AS "阻塞会话SID",
    lo.session_id AS "持有锁的会话SID",
    lo.owner AS "对象所属用户",
    lo.object_name AS "对象名称",
    lo.object_type AS "对象类型",
    CASE lo.locked_mode
        WHEN 0 THEN 'None'
        WHEN 1 THEN 'Null (NULL)'
        WHEN 2 THEN 'Row Share (SS)'
        WHEN 3 THEN 'Row Exclusive (SX)'
        WHEN 4 THEN 'Share (S)'
        WHEN 5 THEN 'Share Row Exclusive (SSX)'
        WHEN 6 THEN 'Exclusive (X)'
        ELSE 'Unknown'
    END AS "锁定模式描述"
FROM 
    waiting_sessions ws
JOIN 
    locked_objects lo ON ws.blocking_session = lo.session_id
ORDER BY 
    ws.blocking_session, ws.sid;
查看阻塞情况并生成阻塞树
-- 查询阻塞树结构
SELECT 
    LPAD(' ', 5 * (LEVEL - 1)) || s.username AS username,
    LPAD(' ', 5 * (LEVEL - 1)) || s.inst_id || ',' || s.sid AS inst_sid,
    s.serial#,
    s.sql_id,
    s.row_wait_obj#,
    s.wait_class,
    s.event,
    s.p1,
    s.p2,
    s.p3,
    s.seconds_in_wait,
    s.blocking_instance || ',' || s.blocking_session AS blocking_inst_sid
FROM 
    gv$session s
WHERE 
    s.blocking_session IS NOT NULL
    OR (s.inst_id || ',' || s.sid) IN (
        SELECT DISTINCT blocking_instance || ',' || blocking_session 
        FROM gv$session
        WHERE blocking_instance IS NOT NULL AND blocking_session IS NOT NULL
    )
START WITH 
    s.blocking_session IS NULL -- 从不被其他会话阻塞的会话开始
CONNECT BY PRIOR 
    (s.inst_id || ',' || s.sid) = (s.blocking_instance || ',' || s.blocking_session)
ORDER SIBLINGS BY 
    s.inst_id, s.sid;
查看特定会话正在执行的SQL语句
SELECT 
    s.sid AS "会话SID",
    s.serial# AS "会话SERIAL#",
    s.username AS "用户名",
    s.status AS "会话状态",
    s.sql_id AS "SQL_ID",
    q.sql_text AS "SQL语句"
FROM 
    v$session s
LEFT JOIN 
    v$sql q ON s.sql_id = q.sql_id
WHERE 
    s.sid = &sid; -- 替换为实际的会话SID

6. 预防和解决问题的策略

预防措施
  • 优化SQL语句:减少不必要的锁争用,尽量使用索引和合适的查询条件。
  • 合理设置隔离级别:根据业务需求选择合适的事务隔离级别,避免过度锁定。
  • 缩短事务持续时间:尽量保持事务简短,尽快提交或回滚。
  • 定期监控锁和阻塞情况:设置自动化的监控脚本,及时发现并处理潜在问题。
解决方案
  • 终止长等待的会话:使用ALTER SYSTEM KILL SESSION命令终止长时间等待锁的会话。
  • 调整应用程序逻辑:重新设计应用程序逻辑,减少并发冲突的可能性。
  • 检查死锁情况:利用Oracle提供的死锁检测机制,自动处理死锁问题。
  • 备份与恢复计划:确保有最新的备份,并准备好应急恢复计划,以防出现意外情况。

7. 案例分析

案例1:频繁的行级锁冲突

问题描述:多个用户同时更新同一张表的不同行,但经常遇到行级锁冲突,导致性能下降。

解决方案

  • 分析SQL语句,确保使用了适当的索引,以最小化锁定范围。
  • 如果可能,将大事务拆分为多个小事务,减少每个事务的持续时间。
  • 考虑增加缓存层,减少直接数据库访问频率。
案例2:长时间的表级锁

问题描述:某张表被长时间锁定,影响了其他用户的正常操作。

解决方案

  • 检查是否有长时间运行的事务未提交或回滚,及时处理这些异常事务。
  • 评估是否可以将表级操作分解为更细粒度的行级操作,减少锁的影响。
  • 如果需要批量操作,考虑在非高峰时段执行,或者采用分区表技术来分散锁的影响。

8. 总结

通过理解锁和阻塞的概念及其相互关系,可以更好地设计应用程序、配置数据库参数以及解决潜在的问题。有效管理和优化锁可以显著提升系统的并发处理能力和响应速度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

devops和ICCID简介

Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI&#xf…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使,可以说是一坨… 关键词:Apache RocketMQ 5.0 JDK 17 废话少说,开整。 1.版本 官网地址,版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

数据结构:算法篇:快速排序;直接插入排序

目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解: ①从待排序元素中选定一个基准元素; ②以基准元素将数据分为两部分:(可以将:大于基准元素放左,小于基准元素放右) ③对左半部分…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

如何打造用户友好的维护页面:6个创意提升WordPress网站体验

在网站运营中,无论是个人博主还是大型企业网站的管理员,难免会遇到需要维护的情况。无论是服务器迁移、插件更新,还是突发的技术故障,都可能导致网站短暂无法访问。这时,设计维护页面能很好的缓解用户的不满&#xff0…

postman读取文件执行

要从文件获取的变量 text 在pre-request 中写从文件获取数据的脚本。脚本实现了,设置了text默认值,从文件读取text列,将text存入环境变量 //获取text参数 var text "济南天气"; if(data.text){ text data.text } pm.environment.…

37. Three.js案例-绘制部分球体

37. Three.js案例-绘制部分球体 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中的一个渲染器类,用于将3D场景渲染到网页上。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数,可选。 常用…

【Rust自学】4.4. 引用与借用

4.4.0 写在正文之前 这一节的内容其实就相当于C的智能指针移动语义在编译器层面做了一些约束。Rust中引用的写法通过编译器的约束写成了C中最理想、最规范的指针写法。所以学过C的人对这一章肯定会非常熟悉。 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文…

电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?

电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误:原因与解决方案 在日常电脑使用中,我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件,如CorelDRAW(简称CDR)时,可能会遇到“计算…

C# 基本信息介绍

总目录 前言 对 C# 做一个基本信息介绍,让我们对 C# 有个基本的认识。 在进行本文的阅读之前,可以瞧瞧 编程基础知识简述 简单的入个门儿。 一、C# 1. C# 概述 C#是由微软公司发布的一种由C和C衍生出来的面向对象的编程语言。 2. C# 详细介绍 C#&am…

『Linux学习笔记』FRPC 详细介绍及配置解析!

『Linux学习笔记』FRPC 详细介绍及配置解析! 文章目录 一. FRPC 详细介绍及配置解析FRPC 的主要功能FRPC 配置文件解析全局配置代理配置第一个代理服务第二个代理服务 配置文件整体工作流程常见配置项说明FRPC 的使用步骤注意事项结论 二. 参考文献 一. FRPC 详细介…

WPS工具栏灰色怎么办

WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中,轮播图是一种常见的用户界面元素,用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现,详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先,在home.js文件中&a…

JavaEE进阶--mybatis使用测试日志参数传递浏览器访问

文章目录 1.项目创建2.mybatis的使用2.1创建初始页面2.2补充yml文件2.3navicate表2.4用户类的编写2.5查询接口2.6运行测试 3.细节说明3.1java开发规范3.2关于包3.3持久层代码 4.测试文件4.1如何生成4.2生成位置4.3补充方法 5.配置mybatis日志6.参数传递6.1单个参数6.2多个参数 …

IDEA用jformdesigner插件做管理系统MVC架构

在 IntelliJ IDEA 中结合 JFormDesigner 插件,通过 Swing 框架实现一个管理系统的 MVC 架构是一种经典的开发方式。以下是具体的步骤和实现思路,包含从项目创建到 MVC 架构的核心代码实现。 1. 项目结构设计 为了清晰的 MVC 分层架构,建议按…

学习Cookie 提升

目录 Cookie 的覆盖​​​​​​​ Cookie下的path 特点 设置Cookie 路径 实例 Cookie的最大存活时间 设置Cookie 存活时间 实例 Cookie 和session的区别 和联系 Cookie 的覆盖 当 key相同 和只要path的上级目录的路径相同,就可以被替换掉 value 值 如下图…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器: 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

4、mysql高阶语句

mysql高阶语句是对复杂的条件进行查询的操作。 排序—order by 加了desc表示由大到小 1、查询name和score,地址都是云南西路的按id进行由小到大排序 2、查询name和score,先按hobbid进行排序,再把结果按id进行排序 第一段字段必须要有相同的…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行,常常需要在狭窄的空间内完成货物的搬运和堆垛,这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离,然而这种方式往往存在误差,特别是在视线受阻或光…

LLaVA 多模态大模型:两阶段训练,实现视觉与语言模态的高效融合

LLaVA 多模态大模型:两阶段训练,实现视觉与语言模态的高效融合 论文大纲理解确认目标分析过程实现步骤效果展示金手指 结构分析1. 层级结构分析叠加形态(从基础到高级)构成形态(部分到整体)分化形态&#x…