【问题标题】:How to resolve java.sql.SQLException distributed transaction waiting for lockjava.sql.SQLException分布式事务等待锁如何解决
【发布时间】:2016-08-25 18:01:05
【问题描述】:

我们使用的是 Oracle 11G 和 JDK1.8 的组合。 在我们的应用程序中,我们使用 XAConnection、XAResource 进行 DB 事务。 即)分布式事务。

在少数情况下,我们需要终止 Java 进程以停止应用程序。 杀死后,如果我们重新启动我们的应用程序,那么我们在执行数据库事务时会收到以下异常。

java.sql.SQLException: ORA-02049: timeout: distributed transaction
waiting for lock

在这几个小时之后,我们无法使用我们的应用程序,直到锁定释放。

谁能给我一些解决方案,以便我们可以继续工作而不是等待锁释放。

我尝试了以下选项:

a) 使用 alter 命令获取 SID 并终止会话。之后,表锁也不会释放。

我正在处理非常少量的数据。

【问题讨论】:

  • 您是如何终止会话的 - 使用 immediate 选项?杀死 Java 进程似乎是一种严厉的方法。你不能添加一个机制来触发一个干净的退出吗?还是应用程序处于无论如何都不会响应的状态?
  • dba_2pc_pending 中是否有一行可以提交或回滚的待处理分布式事务?
  • @justin Cave dba_2pc_pending 中没有可用行

标签: java oracle oracle11g transactions


【解决方案1】:

我关注了一个与tips about what to do with distributed connections类似的话题。

Oracle 连接保持打开状态,直到您结束本地会话或会话的数据库链接数超过 OPEN_LINKS 的值。为了减少与保持数据库链接打开相关的网络开销,如果您不打算在会话中再次使用它,请使用此子句显式关闭链接。

我相信,通过在 DDL 执行后关闭连接和会话,这个问题应该不会发生。

this question上给出了其他可能性:

一种可能的方法是将 Distributed_lock_timeout 的 INIT.ORA 参数增加到更大的值。这将使您有更长的时间来观察 v$lock 表,因为锁会持续更长时间。 要实现这一点的自动化,您可以 - 每 5-10 秒运行一次 SQL 作业,将 v$lock 的值或 sandos 上面给出的查询记录到表中,然后分析它以查看哪个会话导致了锁定。 - 运行 STATSPACK 或 AWR 报告。被锁定的会话应该以较长的经过时间显示,因此可以被识别。 v$session 还有 3 个列 blocking_instance、blocking_session、blocking_session_status,可以添加到上面的查询中,以显示锁定的内容。

我希望我对你有所帮助,我的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多