如何在oracle中使用多个数据库更新来回滚?

时间:2012-06-05 14:22:20

标签: oracle sql-server-2008 postgresql

我想用多个数据库更新,每个数据库包含多个表。如果出现问题,我想将所有数据库和表回滚到原始状态。你能给我任何人建议我能为此做些什么吗?感谢您花时间阅读此问题。

2 个答案:

答案 0 :(得分:1)

您需要一个程序一次连接到所有数据库,并启动对将要更新的表的锁定。

应用您的更改,如果发生异常,则回滚当前数据库和所有先前已完成的数据库。

目标是在所有数据库上保持一个会话同步 - 这不是一件好事。

您的另一个选择是查看是否可以配置零停机安装。这是您将安装分为几个部分的地方 - 可以先应用的内容,之后可以应用的内容。

即。您可以毫无问题地向所有表添加一列(希望如此),这将是预安装。在不再使用列之前无法删除列,因此这是一个后续步骤。这将涉及为视图和包之类的东西提供多个版本,以允许应用程序转换而不会产生任何影响。

答案 1 :(得分:0)

如果您尝试在单个事务中更新多个Oracle数据库,最简单的选择是在它们之间创建数据库链接。这导致Oracle自动使用分布式事务。

在数据库1上,创建数据库链接

CREATE DATABASE LINK to_db2
  CONNECT TO CURRENT_USER
  USING `<<TNS alias to db2>>`;

然后,数据库1中的会话可以更新两个数据库中的表,作为同一事务的一部分

UPDATE table1
   SET some_column = some_value
  ...

UPDATE table2@to_db2
   SET some_column = some_value
  ...

commit;  

可以使用异构服务创建从Oracle到非Oracle数据库的数据库链接,但如果您的Oracle数据库在Unix上运行并且可能需要购买透明网关产品之一,则可能会更加有效。

现在,如果您尝试更新两个数据库中的相同表,则不应该为此编写代码。相反,您应该使用各种复制技术之一将一个数据库上的更改复制到另一个数据库。