我们在大的事务失败时往往面临长时间的回滚,在回滚期间表会被加以TM-3 SX sub-exclusive锁,此时一般我们是无法针对表实施DDL操作的。长时间的大事务回滚可能耗尽我们的耐心,不过我们还是有办法预估何时回滚能够完成的,参考中的脚本<Script:when transaction will finish rollback>中的脚本,注意该脚本需要访问x$ktuxe内部视图,所以需要以sysdba身份方能执行。

SQL> select * from v$lock where type in ('TM','TX');ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
0ED0F30C 0ED0F33C          9 TM      13865          0          3          0       3757          0
2C3975FC 2C39763C          9 TX      65557        677          6          0       3757          0SQL> select object_name,object_type from dba_objects where object_id=13865;OBJECT_NAM OBJECT_TYPE
---------- -------------------
SAMPLE     TABLE因为表上存在TM-3锁,所以此时是无法对表执行需要持有TM-6 exclusive排它锁的DDL操作的SQL> drop table sample;
drop table sample*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expiredSQL> select * from sample where rownum=1 for update nowait;
select * from sample where rownum=1 for update nowait*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expiredrollback完成之前相关行上的row level lock不会被释放,因此dml操作会被blockSQL> select xidusn,xidslot,xidsqn,status from v$transaction;XIDUSN    XIDSLOT     XIDSQN STATUS
---------- ---------- ---------- ----------------1         21        677 ACTIVE从v$tranasction视图中可以看到事务1.21.677处于active状态使用set time on命令显示当前时间SQL> set time on;20:54:26 SQL>set serveroutput on
set feedback off
prompt
prompt Looking for transactions that are rolling back ...
promptdeclarecursor tx isselects.username,t.xidusn,t.xidslot,t.xidsqn,x.ktuxesizfromsys.x$ktuxe  x,sys.v_$transaction  t,sys.v_$session  swherex.inst_id = userenv('Instance') andx.ktuxesta = 'ACTIVE' andx.ktuxesiz > 1 andt.xidusn = x.ktuxeusn andt.xidslot = x.ktuxeslt andt.xidsqn = x.ktuxesqn ands.saddr = t.ses_addr;user_name  varchar2(30);xid_usn    number;xid_slot   number;xid_sqn    number;used_ublk1 number;used_ublk2 number;
beginopen tx;loopfetch tx into user_name, xid_usn, xid_slot, xid_sqn, used_ublk1;exit when tx%notfound;if tx%rowcount = 1thensys.dbms_lock.sleep(10);end if;selectsum(ktuxesiz)intoused_ublk2fromsys.x$ktuxewhereinst_id = userenv('Instance') andktuxeusn = xid_usn andktuxeslt = xid_slot andktuxesqn = xid_sqn andktuxesta = 'ACTIVE';if used_ublk2 < used_ublk1thensys.dbms_output.put_line(user_name ||'''s transaction ' ||xid_usn  || '.' ||xid_slot || '.' ||xid_sqn  ||' will finish rolling back at approximately ' ||to_char(sysdate + used_ublk2 / (used_ublk1 - used_ublk2) / 6 / 60 / 24,'HH24:MI:SS DD-MON-YYYY'));end if;end loop;if user_name is nullthensys.dbms_output.put_line('No transactions appear to be rolling back.');end if;
end;
/MACLEAN's transaction 1.21.677 will finish rolling back at approximately 21:46:45 25-MAY-2011以上脚本给出了估计的1.21.677事务的回滚结束时间为21:46:45,即还有50分钟,
注意这只是根据之前单位时间内rollback的进度所得到的一个估算值,所以并不精确,但还是可以做为一个参考再次运行以上脚本,会发现2次的结果不一定一致SQL> /
MACLEAN's transaction 1.21.677 will finish rolling back at approximately 21:35:47 25-MAY-2011

在产品数据库中应当尽可能避免出现大事务回滚的现象,因为除去lock的影响外,large transaction rollback还会导致CPU使用率大幅上升并产生往往比事务本身所产生的更多的redo重做日志记录。

转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2967782.html

监控一个大事务的回滚相关推荐

  1. oracle修改卡顿,记一次生产环境卡顿优化过程:大事务并发回滚

    概述 最近生产环境有这么个现象,平时的订单调度只需要2s内可以出结果,但是多个人调度就会卡住,超过15分钟都没有结果出来,有时还会失败然后导致数据不准确. 下面记录一下生产环境卡顿时排查的过程. 1. ...

  2. sqlsever回滚操作_sqlserver事务与回滚

    如果要在Production执行数据改动必须小心,可以使用事务提前验证一下自己写的SQL是不是你期望的.尤其是Update的where 条件有问题的话,跟新的记录就会超出预期的范围.如下面的语句,一着 ...

  3. 为什么catch了异常,但事务还是回滚了?

    前几天我发了这篇文章<我来出个题:这个事务会不会回滚?>(https://blog.didispace.com/will-this-transcation-rollback/) 得到了很多 ...

  4. java 自定义异常 未回滚_抛出自定义异常,spring AOP事务不回滚的解决方案

    spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...

  5. 每日一博 - 常见的Spring事务失效事务不回滚案例集锦

    文章目录 事务不生效 方法内部调用 修复方法一 : [新加一个Service方法] 修复方法二:[在该Service类中注入自己] 修复方法三:[通过AopContent类]<---- 推荐 访 ...

  6. 【node】express中mysql的基本用法、连接池的使用、事务的回滚

    [node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...

  7. spring@Transactional注解事务不回滚不起作用无效的问题处理

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...

  8. springboot 事务手动回滚_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  9. Spring 事务不回滚

    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚. 例:      类似这样的方法不会回滚 (一个 ...

  10. @Transactional注解事务不回滚不起作用无效

    @Transactional注解事务不回滚不起作用无效 以下内容均来自http://blog.csdn.net/u011410529/article/details/54287307 转载 这几天在项 ...

最新文章

  1. [ARM-assembly]-ARM64汇编语言学习笔记
  2. Vue中foreach数组与js中遍历数组的写法
  3. 【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
  4. C++ map基本操作
  5. kali下sqliv:SQL注入URL扫描器
  6. springboot项目中mybatis实现数据的基本查询
  7. unrecognized selector sent to instance问题的解决
  8. java调用libreoffice_使用Open / LibreOffice开始使用UNO和Java
  9. 分享6个国内优秀Java后台管理框架的开源项目,建议收藏!
  10. 计算机逻辑门电路图,三态门逻辑电路图大全(三款三态门逻辑电路图)
  11. 星上SAR实时处理调研2-典型应用
  12. 国内学术科研论坛整理
  13. 分位数回归(Stata)
  14. 网络安全界巨擘 王江民
  15. 超声波模块的原理介绍之时间函数和digitalRead函数的使用
  16. Springboot RestTemplate post/get请求所有情况
  17. 终于学会数组的使用啦~~~------C语言数组学习笔记详解
  18. tomcat 做为大型应用的配置
  19. Could not find any downloads that satisfy the requirement opencv-python
  20. 便利店新零售怎么做,才能实现销售额倍增?

热门文章

  1. 《专家系统破解篇 六、IL代码破解--配套乱说》之 FeatherskyExpertSystem
  2. Android Studio R类找不到(Mac)
  3. Caused by: java.lang.ClassNotFoundException: Didn’t find class on path apk Android Studio解决方案
  4. [2018.11.03 T3] 单调序列
  5. BZOJ3757 苹果树
  6. Ajax学习笔记-get请求参数-3
  7. lvcreate 创建逻辑卷
  8. Java中字符串的全部知识_java基础教程之字符串的介绍,比较重要的一个知识点「中」...
  9. python字符串转为ascii码_Python学习经验:无重复字符的最长子串
  10. 手动创建线程池_创建线程池