非常感谢您点击进来!俺家比较富裕,甭管几楼都是沙发,大家随便坐~今天有个问题请教各位:我有一个存储过程,很简单,类似这样:  做事情A  做事情B  做事情C  异常:
    记录日志平常呢,如果做事情中途发生异常,会跳到异常处理,记录日志,以便分析问题;但是我发现,当我在这个session正在跑的时候,在客户端强制把session关掉(关闭客户端程序,或者拔掉网线),这时候数据库有两种表现:1、捕获异常,记录日志,从日志里可以看到是通道异常;2、未捕获异常,过程直接终止执行(类似你用PL/SQL调试的时候,按下Break按钮;当然我说的这种情况不是在调试,是C++Builder写的PC客户端程序在调用存储过程)。1这种情况还比较好,是我想要的结果;但是2就非常讨厌了,可能我需要在异常里做现场恢复等等很多事情,但是程序直接中断,整个流程就等于失控了。请问大家,出现2这种情况是怎么回事?我是从数据库配置去解决这个问题,还是从C++ Builder入手呢?谢谢大家!

解决方案 »

  1.   

    oracle不能控制的。之所以有时有记录,有时没记录。原因是看你的过程执行到哪了。如果执行到捕获异常的地方,就能记录日志。如果没到,就不能记录了。
      

  2.   

    谢谢楼上的分析,我的观察是这样的:正常执行的话,是不会走到异常处理那里的,是可以执行成功的,之所以报异常,是因为我关闭了前台程序,session断了;执行到B(B步骤耗时比较长)时,我把连接断掉,这时候出现两种情况:1 断掉后,程序在服务器端仍在执行,只不过执行任何一个sql语句,都会抛出异常(通道关闭之类),而且执行了异常处理,这是我要的;2 断掉后,程序直接中断,什么都不做(当然未提交的事务还是会回滚的),这是我不希望的;有没有什么配置,可以保证程序总以1的方式来结束呢?
      

  3.   

     任何连接到oralce的前端程序(delphi,c#,c++ builder,java)都能进行设置,对一些sql的执行,是直接commit,还是能回滚。
      另外数据库方面,写的存储过程,进行ABC处理,这些语句是DDL还是DML,这个有很大的关系。
      
      

  4.   

    回楼上:ABC都是DML,这里主要不是事务是否提交的问题,而是连接断开后,服务器端如何反应的问题