`
hbdzhm
  • 浏览: 35276 次
  • 来自: ...
社区版块
存档分类
最新评论

oracle中的阻塞

阅读更多
1.insert产生的阻塞
  如果带有主键并有唯一约束的表,两个会话同时插入一行相同的数据,这样一个会话就会阻塞,处于等待状态,知道另一个会话提交或者回滚事务,如果另一个会话提交或者回滚事务,那么阻塞会话会收到一个错误,错误提示为存在一个重复值。
  解决办法:
     1.1 一般都会用一个序列来生成唯一值。
     1.2 如果无法使用序列,则使用手工锁来避免这一个问题,这里使用内置的DBMS_LOCK来实  现
     注意:这个应用体系本身存在问题,这种方法会增加开销。而且不能轻量级实现。如果设  计良好则不会产生这个问题。千万不要对于应用每个表都使用此方法。
我们可以使用一个触发器来防止两个会话或多个会话同事插入相同的值,这个触发器使用DBMS_UTILITY.GET_ HASH_VALUE来计算主键的散列值,然后使用DBMS_LOCK.REQUEST根据这个ID分配一个排他锁(也称独占锁,exclusive  lock) 。一次只有一个会话能做这个工作,所以,如果有人想用相同的主键值向表中插入一条记录,这个人的锁请求就会失败(并且会产生resource busy(资源忙)错误) :
   触发器原理:触发器会把插入表的主键放到一个字符串,然后使用然后可以使DBMS_UTILITY.GET_HASH_VALUE为这个串得出一个“几乎惟一”的散列值。只要使用小于1 073 741823的散列表,就可以使用DBMS_LOCK 独占地“锁住”这个值。计算散列之后,取得这个散列值,并使用DBMS_LOCK 来请求将这个锁ID独占地锁住(超时时间为ZERO,这说明如果已经有人锁住了这个值,它会立即返回) 。如果超时或者由于某种原因失败了,将产生ORA-54 Resource Busy(资源忙)错误。
 

2.阻塞的Merge、Update和Delete
如果一个交互式应用,可以从数据库中查询某个数据,允许最终用户处理这个数据,再把这个数据放回数据库中,此时如果delete或update阻塞,就说明你的代码中可能存在一个丢失更新问题。就是你的代码中存在BUG。
比如你试图更新一个别人正在更新的行(有人已经锁住了这一行),可以通过select for update nowait查询可以避免这个问题。
这个查询能做到:
  ‰       1.验证自从你查询数据之后数据未被修改(防止丢失更新)。
‰         2.锁住行(防止UPDATE或 DELETE被阻塞) 。





分享到:
评论

相关推荐

    Oracle锁和阻塞原理解析.pdf

    Oracle锁和阻塞原理解析.pdf 了解锁和阻塞是 oracle troubleshooting 必备的技能;在说锁和阻塞之前,我们先了解下 并发(concurrency)和并行(parallel)。并发意思是在数据库中有超过两个以上用户对同样的数 据做修改...

    oracle 触发器实时调用java 中http接口

    在Oracle数据库中,触发器是一种特殊类型的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。在这个场景中,我们关注的是一个特定的触发器,它在插入数据后被调用,并通过存储过程来...

    利用GDAL2.1.2库 把shp文件导入 oracle数据库中 例子

    本文将深入探讨如何利用GDAL 2.1.2版本将Shapefile(SHP)文件导入Oracle数据库,以及这一过程中的关键知识点。 首先,GDAL是一个C++库,它提供了一系列API来读取、写入和处理地理空间数据。GDAL 2.1.2版本包含了对...

    oracle常用监控脚本

    AWR是Oracle 10g引入的自动性能诊断和基线管理组件,它周期性地收集数据库的统计信息,并存储在内存和表中,用于性能比较和问题诊断。 3. **ASH(Active Session History)**: ASH提供了一个细粒度的视图,记录...

    oracle 内存分析

    在Oracle数据库中,内存主要分为两大类:共享内存(System Global Area, SGA)和私有内存(Program Global Area, PGA)。此外,还有用于特定用途的User Global Area (UGA)。下面将详细介绍这些内存区域的组成及其对...

    Oracle.ManagedDataAccess.dll.rar

    1. **添加引用**: 将Oracle.ManagedDataAccess.dll添加到项目的引用中,可以将压缩包解压后直接引用或者通过NuGet包管理器安装Oracle Managed Data Access库。 2. **配置连接字符串**: 在App.config或Web.config...

    Oracle 数据库监听分析及其说明

    Oracle 数据库监听器是数据库系统中的一个关键组件,它负责管理数据库实例与客户端应用程序之间的网络连接。通过监听特定的端口,监听器能够接收来自客户端的连接请求,并将其路由到正确的数据库实例上。这就好比...

    Oracle-AQ Oracle-AQ

    - **异步处理**:在需要异步处理大量数据的情况下,Oracle AQ 提供了一个可靠的解决方案,避免了阻塞式的数据处理过程。 - **事件驱动架构**:Oracle AQ 支持事件驱动架构,使得应用程序能够响应特定事件并触发相应...

    如何解决Oracle杀死死锁进程

    在 Oracle 中,死锁是指两个或多个会话在等待对方释放资源,从而导致互相阻塞的情况。死锁可能会导致数据库性能下降,甚至崩溃。因此,解决死锁问题是非常重要的。 解决 Oracle 杀死死锁进程的步骤: 1. 查找被...

    查询当前阻塞死锁.sql

    脚本查询当前数据库阻塞,阻塞会话事物,进程,锁类型等

    oracle RAC查看blocking的脚本

    下面,我们将深入探讨Oracle RAC中查看阻塞的相关知识点,并基于提供的文件名进行解释。 1. **lsof**: `lsof` 是一个Linux命令行工具,用于列出当前系统中打开文件的状态,包括进程ID、用户、进程状态、文件描述符...

    Oracle.ManagedDataAccess.rar

    Oracle.ManagedDataAccess是Oracle公司为.NET Framework提供的一款官方的、完全托管的数据访问组件,用于在C#等.NET环境中与Oracle数据库进行交互。这个压缩包包含的核心文件"Oracle.ManagedDataAccess.dll"是Oracle...

    Oracle数据库巡检报告

    ### Oracle数据库巡检报告知识点...以上内容涵盖了Oracle数据库巡检报告中的主要检查项,通过对这些关键指标的定期监控与维护,可以有效预防和解决数据库运行过程中可能出现的各种问题,保障业务系统的稳定性和可靠性。

    清除Oracle中长时间持锁的session

    在Oracle数据库管理过程中,有时会遇到一些长时间占用资源的进程,这些进程可能会导致数据库性能下降甚至某些操作无法执行。通常情况下,如果一个session的状态已经被设置为"killed",但其仍然长时间持有系统资源而...

    delphi ODAC oracle 连接控件

    在描述中提到的"delphi ODAC oracle 连接控件",实际上指的是ODAC中的TOracleConnection组件,它是连接Oracle数据库的关键部分。 1. **ODAC概述**: ODAC是Devart公司开发的,旨在为Delphi和C++Builder开发者提供...

    Oracle11g配置服务名

    在Oracle11g中配置服务名是一项重要的操作,它可以帮助用户更方便地管理和访问数据库。本文将详细介绍如何在Oracle11g中配置服务名,包括步骤详解、注意事项等内容。 #### 一、准备工作 在开始配置之前,请确保...

    linux rpm for oracle

    Oracle数据库使用libaio库进行高效的磁盘I/O操作,它允许应用程序直接对磁盘进行非阻塞I/O,从而提高数据存取速度和系统整体性能。 在"描述"中提到的"在linux下安装oracle时需要用到的rpm安装包",这可能包括以下...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对性能的影响完全不同。 - **Lock(锁定)**:用于控制数据库中的数据行或表等资源的访问,...

Global site tag (gtag.js) - Google Analytics