【问题标题】:Have Oracle automatically roll back abandoned sessions?Oracle 是否会自动回滚放弃的会话?
【发布时间】:2011-03-07 21:02:17
【问题描述】:

有什么方法可以保证应用程序不会在 Oracle 中释放行锁失败?如果我确保将提交语句放在 finally 块中,则可以处理意外错误的情况,但是如果应用程序进程在提交之前突然死亡(或者有人将电源线/局域网电缆踢出)怎么办。

有没有办法让 Oracle 在 X 时间后自动回滚空闲会话?或者当我以某种方式检测到连接丢失时回滚?

根据我所做的实验,如果我在提交之前终止应用程序进程,行锁将永远保持,直到我登录数据库并手动终止会话。

谢谢。

【问题讨论】:

    标签: java sql oracle hibernate jdbc


    【解决方案1】:

    在 finally 内部提交可能是您应该做的最后一件事,因为您应该(几乎)永远不要提交任何引发异常的事情。

    【讨论】:

      【解决方案2】:

      尝试在您的sqlnet.ora 中设置SQLNET.EXPIRE_TIME

      SQLNET.EXPIRE_TIME=10
      

      来自documentation

      目的
      指定时间间隔(以分钟为单位)以发送检查以验证客户端/服务器连接是否处于活动状态。

      【讨论】:

      • 这听起来像是答案。使用此功能有什么主要缺点吗?为什么 Oracle 默认不这样做?文档列出了一些缺点,但我看不出它们中的任何一个如何证明默认禁用此功能是合理的。
      • 如果您的查询需要 2 小时才能完成怎么办? :)
      • 根据链接的文档,它只是检查客户端在 EXPIRE_TIME 之后是否还活着。如果客户端每次都响应,则查询可以根据需要进行。
      • 我自己不是 DBA,但除了列出的缺点之外,我没有发现任何其他缺点。试试看它是否适合你。
      • 缺点是,如果你有数百个连接(这在应用服务器之前的日子里很常见),如果 expire_time 很短,这个“检查”可能会占用大量资源。
      【解决方案3】:

      我不是 DBA,所以我相信您可以找到更好的解决方案...

      但有些死锁情况似乎发生了,我们不会自行回滚。我的上一个 DBA 有一个进程,它每分钟运行一次,并杀死运行超过 10 分钟的任何东西。

      【讨论】:

      • 这是一个非常糟糕的主意。例如,如果您的数据库变得非常大,您可能很容易最终终止收集统计数据作业(或者,更糟糕的是,备份)。
      • 你必须小心你让它杀死的东西,这是由应用服务器启动的东西(不会收集统计数据或备份)
      猜你喜欢
      • 2012-02-12
      • 2015-02-10
      • 2013-04-05
      • 1970-01-01
      • 2012-05-12
      • 2010-11-30
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      相关资源
      最近更新 更多