Oracle ALTER SESSION ADVISE COMMIT?

时间:2011-06-03 02:29:16

标签: oracle 2phase-commit

我的应用程序可以自动从故障中恢复。我测试如下:

  1. 启动应用
  2. 在处理过程中,终止应用程序服务器主机(shutdown -r -f)
  3. 在主机重启时,应用程序服务器重新启动(作为Windows服务)
  4. 应用程序重新启动
  5. 应用程序尝试处理,但在上一次会话中由Oracle DB中的不完整的两阶段提交事务阻止。
  6. 在10到30分钟之后的某个时间,DB解析了之前的txn,处理继续OK。
  7. 我需要它继续处理比这更快。我的DBA建议我应该在我的声明前加上

    ALTER SESSION ADVISE COMMIT;
    

    但他无法向我提供有关数据丢失可能性的保证或细节。

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

    但是,对我的问题。上面的陈述到底是做什么的? Oracle如何解决数据同步问题?

1 个答案:

答案 0 :(得分:2)

您能否澄清“情景”中“本地”和“远程”数据库的作用。

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

  1. 开始交易
  2. 对数据库进行更改
  3. 对其他数据库进行更改
  4. 获取另一个“承诺提交”
  5. 的数据库
  6. 本地提交
  7. 获取要提交的远程数据库
  8. 如果步骤4完成然后出现故障,则会发生疑问。通常的做法是重新启动远程数据库并确认它是否已提交。如果是,则步骤(5)继续。如果无法提交事务的远程组件,则回滚本地组件。

    您的描述似乎是指应用服务器故障,这是一个不同的鱼群。在您的情况下,我认为方案如下:

    1. App服务器接受连接并启动交易
    2. App服务器在没有提交的情况下死亡
    3. App服务器重新启动并建立新的数据库连接
    4. App服务器在新连接上启动新事务
    5. 新事务被“卡住”等待旧连接/事务所持有的锁定
    6. 20分钟后,终止连接终止,事务回滚
    7. 然后新交易继续
    8. 在这种情况下,解决方案是更快地终止旧连接,使用较短的超时(例如服务器的sqlnet.ora中的SQLNET_EXPIRE_TIME)或手动的ALTER SYSTEM KILL SESSION。