此分析报告基于用户所提供之logMiner 信息和alter.log作为分析依据。

1.2 简单描述

3月26日14:15分左右orcl数据库中业务正常流程事务操作INSERT和UPDATE,该事务DML操作涉及到多张表包括OBJ# 82378″。该事务在执行INSERT/UPDATE操作后一直未提交事务即COMMIT操作。该事务的唯一ID XID为” 0012001B0001FD1F”。

在3月26号的15:36分左右该XID为” 0012001B0001FD1F”的事务被异常回滚,可以在Logminer信息中找到如下信息:

2016/3/26 15:36 rollback;

回滚的undo语句:

update “UNKNOWN”.”OBJ# 82378″ set “COL 3” = NULL, “COL 30” = NULL, “COL 31” = NULL, “COL 36” = HEXTORAW(‘393939393939’) where ROWID = ‘AAAUHKAAGAAJF6aAAQ’;

delete from “UNKNOWN”.”OBJ# 82378″ where ROWID = ‘AAAUHKAAGAAJF6aAAQ’;

通过模拟事故测试发现:

当应用程序设计不当,主动发起不合理的回滚

当Oracle会话或进程被kill session或kill进程时也会被动回滚

上述2种情况下,其logminer挖掘出的日志情况与本例中的实际logmnr结果并无差别,事务均有一个rollback类型的redo opcode对应的rollback;语句所回滚,且对应的session信息也没有区别。

由于上述存在2种可能,且目前无法通过有限的logmnr数据找出其中的区别。故针对本次的异常回滚问题提供多方面的建议。

上述2种测试模拟情况详见 附录的场景1、2。

3.结果与建议

1、此例中发生问题的一个主要原因在于事务开始后一直没有有效提交,故最为重要的建议是检查代码中是否存在执行了DML事务后没有及时提交的问题,在PRO*C语言中执行SQL并及时COMMIT提交,语句如:

EXEC SQL COMMIT WORK RELEASE;

2、由于无法确认是否Oracle session/process异常退出,故建议考虑在应用程序中增加记录Oracle报错的日志,这样当Oracle session/process异常退出时,应用程序日志应当能捕捉到例如ORA-03113 “end-of-file on communication channel”的报错。

3、若数据库的负载不高则考虑打开10046 trace即SQL跟踪功能以便了解SQL执行的详细情况,或酌情考虑打开数据库审计audit功能。

附录:模拟测试过程

创建一张测试表test(id,text)。

测试事务使用语句:

insert into test values(1,’a’);

update test set text=’test’ where id=1;

场景1:

应用程序自身主动发起不合理的回滚操作,即执行rollback;语句。通过日志挖掘可以发下如下情况:

会出现一个rollback,然后所有在这个事务中的语句全部回滚,并且是在同一个会话中发生。

现象与客户提交的信息相符,下面是客户方提供的信息:

可以发下在3月26号的15:36分左右,确实出现了回滚操作。在数据库的alert.log中相关时间段无任何报错或告警详细。

在会话中使用rollback 回滚事务:

insert into test values(1,’a’);

update test set text=’test’ where id=1;

rollback;

切换日志:

alter system switch logfile;

使用LogMiner分析产生的日志:

–附加日志

exec DBMS_LOGMNR.ADD_LOGFILE(‘/u01/app/oracle/product/11.2.0/db_1/dbs/arch1_112_904574553.dbf’,dbms_logmnr.NEW);

–启动分析

exec DBMS_LOGMNR.START_LOGMNR(OPTIONS =>SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

–查询结果

select * from v$logmnr_contents;

结果如下:

场景2:使用alter kill session杀掉会话和在系统层面kill掉进程

在会话中运行测试语句:

insert into test values(1,’a’);

update test set text=’test’ where id=1;

insert into test values(1,’a’);

insert into test values(1,’a’);

insert into test values(1,’a’);

查询到相关会话的sid和相关系统层面的PID

select * from v$session

select * from v$process

然后使用alter system kill session ‘xxx,xxx’杀掉会话。或在系统层面直接kill -9 掉相关进程。再和之前一样的步骤进行日志挖掘分析。可以得到相同的结果:

检查这些日志挖掘信息,都是在一个事务中的所有语句回滚,并且是在一个会话中完成的。

oracle反生异常会回滚吗,Oracle transaction rollback 事务异常回滚问题分析相关推荐

  1. Try-Catch 包裹的代码异常后,竟然导致了产线事务回滚!| 原力计划

    一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着< ...

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

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

  3. JAVA Spring 事务管理事务不回滚问题

    Spring事务管理事务不回滚 dao层: @Repository public class UserDaoImpl implements UserDao { @Autowired private J ...

  4. 【java基础】子线程任务发生异常,主线程事务如何回滚?

    文章目录 一.提出问题 二.主线程与子线程 三.线程池 四.异常的捕获 五.事务的回滚 一.提出问题 最近有一位朋友问了我这样一个问题,问题的截图如下: 这个问题问的相对比较笼统,我来稍微详细的描述下 ...

  5. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  6. Spring事务异常回滚,捕获异常不抛出就不会回滚

    Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...

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

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

  8. SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚

    Springboot中事务的使用: 1.启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的). 2.在使用事务的public(只有public支持事 ...

  9. 异常被 ”吃“ 掉导致事务无法回滚

    我们在处理异常时,有两种方式,要么抛出去,让上一层来捕获处理:要么把异常 try catch 掉,在异常出现的地方给处理掉.就因为有这中 try-catch,所以导致异常被 "吃" ...

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

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

最新文章

  1. panda对于EXCEL单元赋值如何能够设置string?
  2. java2d简介_AWT_Java2D简介
  3. 平台型OA=高性价比OA?
  4. linux下 命令 实验,实验一:Linux命令实验
  5. 学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student)。请用Python语言简要实现这些类及及其属性,以及它们之间的关系。
  6. SAP CRM Product category的决定逻辑
  7. React笔记-事件分发
  8. android学习之-Style样式的定义
  9. 00038oracle,ORACLE错误一览表
  10. 设计趋势:液态渐变色彩背景
  11. pythondjango是干什么的_python django框架是什么?怎么使用?
  12. 以下实例在用户点击按钮后对字符串进行反转操作
  13. Ubuntu Desktop安装及桌面美化(修复图片)
  14. react实现异步插件_初识react(四) react中异步解决方案之 redux-saga
  15. java面试常考_java面试常考题
  16. linux ap中继模式,小米AIoT AX3600 WiFi 6有线中继模式(AP模式)自定义局域网LAN IP地址...
  17. 创建批处理文件.bat文件(删除指定文件夹下的文件及文件夹并循环)
  18. C# PDF转图片(JPG,Png)
  19. Android studio 冲突解决
  20. 【Mac SSH】SSH连接工具finalShell推荐

热门文章

  1. 如何获得一个干净的 gnome 开发环境?
  2. Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
  3. Win10系统80端口被系统进程占用
  4. asp.net中如何退出整个框架(frameset ),回到登录界面?
  5. WinAPI 字符及字符串函数(13): lstrcmp、lstrcmpi - 对比串
  6. 为什么使用梯度下降法或者梯度上升法
  7. python怎么恢复默认窗口,如何恢复python编程环境spyder的窗口
  8. java string 转 class_java-String类的转换功能
  9. unity 电梯_unity应用实例——电梯模拟系统
  10. 拓端tecdat|R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例