oracle内部异常,IIS不定期Crash和Oracle“未处理的内部错误(-2)”的问题分析
问题描述:系统不定期报出Oracle“未处理的内部错误(-2)”,严重时IIS会Crash
典型异常日志如下:
Exception type: System.AccessViolationException
Message: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
InnerException:
StackTrace (generated):
SP IP Function
000000000C388FE0 0000000000000001 System_Data_OracleClient_ni!System.Data.Common.UnsafeNativeMethods.OCILobCreateTemporary(System.Data.OracleClient.OciHandle, System.Data.OracleClient.OciHandle, System.Data.OracleClient.OciHandle, UInt16, CHARSETFORM, LOB_TYPE, Int32, DURATION)+0x2
000000000C3890F0 000007FEF4627DEF System_Data_OracleClient_ni!System.Data.OracleClient.TracedNativeMethods.OCILobCreateTemporary(System.Data.OracleClient.OciHandle, System.Data.OracleClient.OciHandle, System.Data.OracleClient.OciHandle, UInt16, CHARSETFORM, LOB_TYPE, Int32, DURATION)+0xef
000000000C3891A0 000007FEF464FC82 System_Data_OracleClient_ni!System.Data.OracleClient.OracleLob..ctor(System.Data.OracleClient.OracleConnection, System.Data.OracleClient.OracleType)+0xc2
000000000C389210 000007FEF463ED33 System_Data_OracleClient_ni!System.Data.OracleClient.OracleParameterBinding.CreateTemporaryLobForValue(System.Data.OracleClient.OracleConnection, System.Data.OracleClient.OracleType, System.Object)+0x63
000000000C389260 000007FEF463FE68 System_Data_OracleClient_ni!System.Data.OracleClient.OracleParameterBinding.PrepareForBind(System.Data.OracleClient.OracleConnection, Int32 ByRef)+0x178
000000000C3892D0 000007FEF46322A1 System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.Execute(System.Data.OracleClient.OciStatementHandle, System.Data.CommandBehavior, Boolean, System.Data.OracleClient.OciRowidDescriptor ByRef, System.Collections.ArrayList ByRef)+0x381
000000000C3893C0 000007FEF46328C6 System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean, System.Data.OracleClient.OciRowidDescriptor ByRef)+0xa6
000000000C389450 000007FEF46327DE System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.ExecuteNonQuery()+0x10e
。。。。。。。。。。。
。。。。。。。。。。。
000000000C38E590 000007FEF8FCF8A6 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+0x286
000000000C38E6F0 000007FEF8FCF60A mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+0xa
000000000C38E720 000007FEF8F7B220 mscorlib_ni!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+0x70
000000000C38E770 000007FEF8F7B82B mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+0x1eb
Nested exception -------------------------------------------------------------
Exception object: 0000000182836198
Exception type: System.InvalidOperationException
Message: 未处理的内部错误(-2)。
InnerException:
StackTrace (generated):
SP IP Function
000000000C38DDD0 000007FEF469DE51 System_Data_OracleClient_ni!System.Data.OracleClient.OracleConnection.CheckError(System.Data.OracleClient.OciErrorHandle, Int32)+0x71951
000000000C38DE10 000007FEF463244B System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.Execute(System.Data.OracleClient.OciStatementHandle, System.Data.CommandBehavior, Boolean, System.Data.OracleClient.OciRowidDescriptor ByRef, System.Collections.ArrayList ByRef)+0x52b
000000000C38DF00 000007FEF4631F14 System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.Execute(System.Data.OracleClient.OciStatementHandle, System.Data.CommandBehavior, System.Collections.ArrayList ByRef)+0x24
000000000C38DF50 000007FEF4633E00 System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.ExecuteReader(System.Data.CommandBehavior)+0x130
000000000C38E010 000007FEF46326B9 System_Data_OracleClient_ni!System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(System.Data.CommandBehavior)+0x9
000000000C38E040 000007FEF60C67A5 System_Data_ni!System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(System.Data.CommandBehavior)+0x15
000000000C38E070 000007FEF60AA555 System_Data_ni!System.Data.Common.DbDataAdapter.FillInternal(System.Data.DataSet, System.Data.DataTable[], Int32, Int32, System.String, System.Data.IDbCommand, System.Data.CommandBehavior)+0x145
000000000C38E120 000007FEF60AA394 System_Data_ni!System.Data.Common.DbDataAdapter.Fill(System.Data.DataSet, Int32, Int32, System.String, System.Data.IDbCommand, System.Data.CommandBehavior)+0x1a4
000000000C38E1D0 000007FEF60AA196 System_Data_ni!System.Data.Common.DbDataAdapter.Fill(System.Data.DataSet)+0x116
原因分析:
查阅资料发现使用DBLink查询时,oracle会开启隐式分布式事务,进而会引发ORA-24784和内部错误(-2)的异常。
与业务组同事交流,项目上确实使用了DBLink;
分析服务器的事件查看器和业务系统日志,也发现了ORA-24784的Exception,如下:
{"code":24784,"ClassName":"System.Data.OracleClient.OracleException","Message":"ORA-24784:事务处理已存在\u0000","Data":null,"InnerException":null,"HelpURL":null,"StackTraceString":"
System.Data.OracleClient.OciEnlistContext.Join(OracleInternalConnection internalConnection, Transaction indigoTransaction)\r\n
System.Data.OracleClient.OracleInternalConnection.Enlist(String userName, String password, String serverName, Transaction transaction, Boolean manualEnlistment)\r\n
System.Data.OracleClient.OracleInternalConnection.Activate(Transaction transaction)\r\n
System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)\r\n
System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)\r\n
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)\r\n
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)\r\n
System.Data.OracleClient.OracleConnection.Open()\r\n
Demo验证:
经过分析测试验证,使用DBLink的查询确实会开启一个隐式的事务,该数据库连接被重用后如果再显示的开启一个分布式事务时,系统会产生ORA-24784:事务处理已存在的错误。
问题结论
在并发的混合场景下,通过抓取first chance Exception dump,发现ORA-24784与(-2)、IIS Crash相伴而生,具有很强的关联性。
代码排查所有DBLink的使用,DBLink查询后增加显式的commit调用,以提交因oracle DBLink产生的隐式事务。
相关资料:
oracle官方文档:http://files.cnblogs.com/files/zhaoguan_wang/ORA-24784_Oracle_XA%E6%96%87%E6%A1%A3_ID_1271726.1.pdf
原文:http://www.cnblogs.com/zhaoguan_wang/p/4884269.html
oracle内部异常,IIS不定期Crash和Oracle“未处理的内部错误(-2)”的问题分析相关推荐
- 连接oracle数据库异常System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本
1.连接oracle数据库异常System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本 本人在用公司用C#写的服务连接数据库oracle 时,报出上面的 ...
- oracle查找异常中断的sqlid方法,Oracle查找锁定对象以及强制解除锁定的方法
1.用dba权限的用户查看数据库都有哪些锁 select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$s ...
- oracle故障分析报告,Oracle 数据库异常宕机错误分析:ORA-01092
在数据库运维中,也许每一个DBA都很怕ORA-600,导致600错误的原因常常难觅踪迹,大部分情况下可能是由bug导致的,因此成为广大DBA的噩梦. 但是遇到ORA-600的机会并不会很高.根据Bet ...
- 细数oracle的异常
1.首先是oracle自身的异常抛出 目录 1.首先是oracle自身的异常抛出 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超 ...
- oracle主键重复异常捕获,Oracle异常处理异常处
Oracle异常处理异常处理是考验一个应用程序健壮性的最好方式,开发人员必须考虑程序中可能出现的各种错误,并进行相应的处理. Oracle中异常分为:1.预定义异常2.非预定义异常3.自定义异常三种. ...
- oracle异常抛出,ORACLE 存储过程异常捕获并抛出
for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...
- ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法
ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法(转载) 10小时前 ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法(转载) 分类: ASP.NET| ...
- ORACLE 存储过程异常捕获并抛出
ORACLE 存储过程异常捕获并抛出 参考文章: (1)ORACLE 存储过程异常捕获并抛出 (2)https://www.cnblogs.com/wdw31210/p/7009731.html 备忘 ...
- oracle 作业 断开原因,解惑 | Oracle JOB 异常中断原因分析
注释 今天研发同事找我确认 PKG_WMS.proc_TaskMain 存储的 job 是否还在运行,竟发现 dba_jobs.NEXT_DATE=4000/1/1. 如下看看究竟原因吧~ JOB 信 ...
最新文章
- package org.springframework.stereotype包不存在
- python学生管理系统-python实现学生管理系统
- centos7 nat模式配置静态ip_Linux不进入网卡配置文件更改静态ip
- How to scroll the window using JQuery $.scrollTo() function
- Java异常中受检异常非受检异常与RuntimeException异常关系
- 【ArcObject开发】实验:ArcGIS Desktop开发方式入门基础教程
- Unity Hub安装Android Build Support报错:Failed to delete old Unity Android Supprtinstallation files
- 开源十问, 社区新人快速上手指南
- Python异常处理try...except...finally raise assert
- 状态服务器与无状态服务器(要点)
- 人工智能机器学习笔记 10月15日
- map的基本操作总结C++
- 反转单链表的几种方法
- java面向对象传播智客,传智播客java培训 java基础之javabean
- msvcp140.dll是什么?丢失了msvcp140.dll要如何修复?
- 本特利前置器330180-90-00
- Java代理模式——CGLIB动态代理
- .NET的RulesEngine(规则引擎)使用
- ClickHouse-物化视图
- 金蝶采购模块采购赠品业务处理逻辑