【问题标题】:Oracle ALTER SESSION ADVISE COMMIT?Oracle 更改会话建议提交?
【发布时间】:2011-06-03 02:29:16
【问题描述】:

我的应用会自动从故障中恢复。我测试如下:

  1. 启动应用程序
  2. 在处理过程中,杀死应用服务器主机(shutdown -r -f)
  3. 主机重新启动时,应用程序服务器重新启动(作为 Windows 服务)
  4. 应用程序重新启动
  5. 应用程序尝试处理,但被先前会话中 Oracle DB 中不完整的 2 阶段提交事务阻止。
  6. 大约 10 到 30 分钟后,DB 解析了先前的 txn,并且处理继续正常。

我需要它以比这更快的速度继续处理。我的 DBA 建议我应该在声明前加上

ALTER SESSION ADVISE COMMIT;

但他无法保证或详细说明这样做可能导致数据丢失。

幸运的是,有问题的语句只是每隔一秒左右将 datetime 值更新为 SYSDATE,所以如果有一些数据损坏,它会在被覆盖之前持续

但是,对于我的问题。上面的语句究竟做了什么? Oracle在使用时如何解决数据同步问题?

【问题讨论】:

    标签: oracle 2phase-commit


    【解决方案1】:

    您能否阐明“本地”和“远程”数据库在您的场景中的作用。

    通常multi-db transaction 会执行以下操作

    1. 开始事务
    2. 对数据库进行更改
    3. 对其他数据库进行更改
    4. 让另一个数据库“承诺提交”
    5. 本地提交
    6. 获取要提交的远程数据库

    如果第 4 步完成然后某些事情失败,则会发生可疑交易。一般的做法是备份远程数据库并确认它是否已提交。如果是,则步骤(5)继续。如果无法提交事务的远程组件,则回滚本地组件。

    您的描述似乎是指应用服务器故障,这是另一回事。在您的情况下,我认为情况如下:

    1. 应用服务器建立连接并启动事务
    2. 应用服务器没有提交就死机
    3. 应用服务器重启并建立新的数据库连接
    4. 应用服务器在新连接上启动新事务
    5. 新事务“卡住”等待旧连接/事务持有的锁
    6. 20 分钟后,死连接终止,事务回滚
    7. 然后继续新事务

    在这种情况下,解决方案是更快地关闭旧连接,使用更短的超时时间(例如服务器的 sqlnet.ora 中的SQLNET_EXPIRE_TIME)或手动 ALTER SYSTEM KILL SESSION。

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2016-09-16
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多