oracle反生异常会回滚吗,Oracle transaction rollback 事务异常回滚问题分析
此分析报告基于用户所提供之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 事务异常回滚问题分析相关推荐
- Try-Catch 包裹的代码异常后,竟然导致了产线事务回滚!| 原力计划
一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着< ...
- sqlsever回滚操作_sqlserver事务与回滚
如果要在Production执行数据改动必须小心,可以使用事务提前验证一下自己写的SQL是不是你期望的.尤其是Update的where 条件有问题的话,跟新的记录就会超出预期的范围.如下面的语句,一着 ...
- JAVA Spring 事务管理事务不回滚问题
Spring事务管理事务不回滚 dao层: @Repository public class UserDaoImpl implements UserDao { @Autowired private J ...
- 【java基础】子线程任务发生异常,主线程事务如何回滚?
文章目录 一.提出问题 二.主线程与子线程 三.线程池 四.异常的捕获 五.事务的回滚 一.提出问题 最近有一位朋友问了我这样一个问题,问题的截图如下: 这个问题问的相对比较笼统,我来稍微详细的描述下 ...
- Spring事务异常回滚,try catch 捕获异常不回滚
Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...
- Spring事务异常回滚,捕获异常不抛出就不会回滚
Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...
- 为什么catch了异常,但事务还是回滚了?
前几天我发了这篇文章<我来出个题:这个事务会不会回滚?>(https://blog.didispace.com/will-this-transcation-rollback/) 得到了很多 ...
- SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚
Springboot中事务的使用: 1.启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的). 2.在使用事务的public(只有public支持事 ...
- 异常被 ”吃“ 掉导致事务无法回滚
我们在处理异常时,有两种方式,要么抛出去,让上一层来捕获处理:要么把异常 try catch 掉,在异常出现的地方给处理掉.就因为有这中 try-catch,所以导致异常被 "吃" ...
- oracle修改卡顿,记一次生产环境卡顿优化过程:大事务并发回滚
概述 最近生产环境有这么个现象,平时的订单调度只需要2s内可以出结果,但是多个人调度就会卡住,超过15分钟都没有结果出来,有时还会失败然后导致数据不准确. 下面记录一下生产环境卡顿时排查的过程. 1. ...
最新文章
- panda对于EXCEL单元赋值如何能够设置string?
- java2d简介_AWT_Java2D简介
- 平台型OA=高性价比OA?
- linux下 命令 实验,实验一:Linux命令实验
- 学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student)。请用Python语言简要实现这些类及及其属性,以及它们之间的关系。
- SAP CRM Product category的决定逻辑
- React笔记-事件分发
- android学习之-Style样式的定义
- 00038oracle,ORACLE错误一览表
- 设计趋势:液态渐变色彩背景
- pythondjango是干什么的_python django框架是什么?怎么使用?
- 以下实例在用户点击按钮后对字符串进行反转操作
- Ubuntu Desktop安装及桌面美化(修复图片)
- react实现异步插件_初识react(四) react中异步解决方案之 redux-saga
- java面试常考_java面试常考题
- linux ap中继模式,小米AIoT AX3600 WiFi 6有线中继模式(AP模式)自定义局域网LAN IP地址...
- 创建批处理文件.bat文件(删除指定文件夹下的文件及文件夹并循环)
- C# PDF转图片(JPG,Png)
- Android studio 冲突解决
- 【Mac SSH】SSH连接工具finalShell推荐
热门文章
- 如何获得一个干净的 gnome 开发环境?
- Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
- Win10系统80端口被系统进程占用
- asp.net中如何退出整个框架(frameset ),回到登录界面?
- WinAPI 字符及字符串函数(13): lstrcmp、lstrcmpi - 对比串
- 为什么使用梯度下降法或者梯度上升法
- python怎么恢复默认窗口,如何恢复python编程环境spyder的窗口
- java string 转 class_java-String类的转换功能
- unity 电梯_unity应用实例——电梯模拟系统
- 拓端tecdat|R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例