专栏首页乐沙弥的世界Oracle 阻塞(blocking blocked)

Oracle 阻塞(blocking blocked)

   阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计的阻塞将导致性能严重下降直至数据库崩溃。对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者。本文对此给出了描述并做了相关演示。

1、阻塞及其类型 a、什么是阻塞    一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking)。也就是说新的会话会被挂起,直到持有锁的会话放弃锁定的资源。大多数情况下,在一个交互式应用中被严重阻塞,即可表明应用逻辑有问题,这才是阻塞的根源。 b、阻塞得类型    数据库中有5条常见的DML语句可能会阻塞,即:INSERT、UPDATE、DELETE、MERGE 和SELECT FOR UPDATE。

2、几种不同类型阻塞的处理办法 a、INSERT阻塞主要是由于有一个带主键的表,或者表上有惟一的约束,在两个会话试图用同样的值插入一行时引发阻塞。多表通过引用完整性约束相互链接时,在其依赖的父表正在创建或删除期间,对子表的插入可能会阻塞。对于该类情形建议使用序列来生成主键/惟一列值。 b、对于UPDATE、DELETE、MERGE 和SELECT FOR UPDATE阻塞,只要有任一session使用这些操作已经锁定行,其余的必须处于等待状态。直到当前锁定行上的锁(排他锁)释放。对于该类情形,建议尽可能快速提交事务,或采用批量SQL方式提交。 c、对于一个阻塞的SELECT FOR UPDATE,解决方案很简单:只需增加NOWAIT 子句,它就不会阻塞了。

3、演示阻塞

--更新表,注,提示符scott@CNMMBO表明用户为scott的session,用户名不同,session不同。
scott@CNMMBO> update emp set sal=sal*1.1 where empno=7788;

1 row updated.

scott@CNMMBO> @my_env

SPID                SID    SERIAL# USERNAME        PROGRAM
------------ ---------- ---------- --------------- ------------------------------------------------
11205              1073       4642 robin           oracle@SZDB (TNS V1-V3)

--另起两个session更新同样的行,这两个session都会处于等待,直到第一个session提交或回滚
leshami@CNMMBO> update scott.emp set sal=sal+100 where empno=7788;

goex_admin@CNMMBO> update scott.emp set sal=sal-50 where empno=7788;

--下面在第一个session 查询阻塞情况
scott@CNMMBO> @blocker 

BLOCK_MSG                                               BLOCK
-------------------------------------------------- ----------
pts/5 ('1073,4642') is blocking 1067,10438                  1
pts/5 ('1073,4642') is blocking 1065,4464                   1
--上面的结果表明session 1073,4642 阻塞了后面的2个
--即session 1073,4642是阻塞者,后面2个session是被阻塞者

--Author : Leshami
--Blog   : http://blog.csdn.net/leshami

--下面查询正在阻塞的session id,SQL语句以及被阻塞的时间
scott@CNMMBO> @blocking_session_detail.sql

'SID='||A.SID||'WAITCLASS='||A.WAIT_CLASS||'TIME='||A.SECONDS_IN_WAIT||CHR(10)||'QUERY='||B.SQL_TEXT
-------------------------------------------------------------------------------------------------------
sid=1067 Wait Class=Application Time=5995
 Query=update scott.emp set sal=sal+100 where empno=7788

sid=1065 Wait Class=Application Time=225
 Query=update scott.emp set sal=sal-50 where empno=7788

--下面的查询阻塞时锁的持有情况 
scott@CNMMBO> @request_lock_type

USERNAME                              SID TY LMODE       REQUEST            ID1        ID2
------------------------------ ---------- -- ----------- ----------- ---------- ----------
SCOTT                                1073 TX Exclusive   None            524319      27412
LESHAMI                              1067 TX None        Exclusive       524319      27412
GOEX_ADMIN                           1065 TX None        Exclusive       524319      27412
--可以看到LESHAMI,GOEX_ADMIN 2个用户都在请求524319/27412上的Exclusive锁,而此时已经被SCOTT加了Exclusive锁

--查询阻塞时锁的持有详细信息
scott@CNMMBO> @request_lock_detail

       SID USERNAME             OSUSER          TERMINAL                  OBJECT_NAME          TY Lock Mode   Req_Mode
---------- -------------------- --------------- ------------------------- -------------------- -- ----------- --------------------
      1065 GOEX_ADMIN           robin           pts/1                     EMP                  TM Row Excl
      1065 GOEX_ADMIN           robin           pts/1                     Trans-524319         TX --Waiting-- Exclusive
      1067 LESHAMI              robin           pts/0                     EMP                  TM Row Excl
      1067 LESHAMI              robin           pts/0                     Trans-524319         TX --Waiting-- Exclusive
      1073 SCOTT                robin           pts/5                     EMP                  TM Row Excl
      1073 SCOTT                robin           pts/5                     Trans-524319         TX Exclusive 

文中涉及到的相关脚本下载:http://download.csdn.net/detail/robinson_0612/7607033

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Oracle 重建索引脚本

          索引是提高数据库查询性能的有力武器。没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难。然而索引在使用的过程中,尤其是在批量的D...

    Leshami
  • FORALL 之 SAVE EXCEPTIONS 子句应用一例

         对于大批量的DML操作中出现的错误,除了使用DML error logging特性来记录在DML期间出现的错误之外,使用批量SQL语句FORALL的S...

    Leshami
  • 记一次奇怪的ORA-04028: cannot generate diana for object

          开发人员说新建了一个package,在编译的过程中出现了一些错误。提示为PL/SQL:ORA-00942: table or view does n...

    Leshami
  • 算法-链表反转操作

    题目: 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点。链表定义如下: struct ListNode { int value; ...

    chaibubble
  • 小程序将赶超淘宝 变成主流消费模式?

    小程序面世已经1年,有很多行内人士表明小程序未来将有巨大的商业价值,并会转变人的消费行为模式,变成未来在整个消费支出里面非常主流的行为。 ? 来自微信官方201...

    企鹅号小编
  • 互联网零售新波澜:RPA在电商行业的应用场景

    据艾媒咨询 (iMedia Research)数据显示,2019年上半年,中国的网络零售总额已达到195209.7亿元,尽管前有阿里、京东、拼多多、苏宁等行业巨...

    蕉黄
  • nginx 多进程架构详解

    一、进程模型 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧。

    后端技术探索
  • 房地产行业分化加剧,电子签约如何赋能房企扩大竞争优势?

    近年来,房地产行业在市场的不断变化和政府调控下,整体呈现出业绩持续增长、企业分化加剧、行业集中度不断提高的发展态势。电子签约因其安全、便捷、合规等特点,开始被房...

    法大大电子合同
  • 当微信小程序遇上TensorFlow - 本地缓存模型

    从明天开始,我开始休年假,准备去云南逛一逛,估计这段时间又无法更新公众号,还请大家谅解。

    云水木石
  • 我在闲鱼当卖家被诈骗了五台电脑,花了十五天揪出骗子亲自送往警局!

    于是我打开了闲鱼(一款闲置交易平台),把五台电脑都打包售卖了,因为配置都不高就挂了1W8。

    周三不加班

扫码关注云+社区

领取腾讯云代金券