1

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

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

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

ALTER SESSION ADVISE COMMIT;

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

幸运的是,有问题的语句只是每隔一秒左右更新一个datetimeSYSDATE,所以如果有一些数据损坏,它会在被覆盖之前持续 < 1 秒。

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

4

1 回答 1

3

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

通常,多数据库事务执行以下操作

  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-06-03T03:46:14.053 回答