2012-08-16 67 views
3

我有一个单一的连接,它在Oracle数据库的两个不同模式的对象上执行DML。我完成了涉及schema A中的对象的事务,然后开始第二个事务以处理schema B中的对象。如果在第二个事务中工作时发生任何错误,我想回滚这两个事务的更改。那可能吗?跨数据库中的多个模式的事务

+2

您已经标记了这个问题甲骨文。您是否按照Oracle定义的术语使用术语“数据库”?如果是这样,就不可能有多个数据库的单一连接。或者,使用Oracle术语,您是指在同一数据库的两个不同模式中修改数据的进程? – 2012-08-16 19:14:41

+0

我指的是同一个数据库的两种不同模式 – BALASCJP 2012-08-16 19:21:02

+0

好吧,我想我编辑了你的问题来澄清你在说什么 - 请确保我已经正确理解了这个问题。 – 2012-08-16 19:25:32

回答

2

如果您想把对两种模式中所做的更改被提交或回滚在一起,你需要使用一个单一的交易。一旦你提交了第一笔交易,如果第二笔交易失败,你就不能再回滚它(可能的话,你可以使用闪回技术,但它更多地涉及方式)。但是,如果您在两个模式中使用单个事务处理您所做的工作,则会得到您希望所有更改都将以原子方式提交或回滚的行为。

+0

我的理解感谢您的信息u可以请举一个简单的example.Because作为一个新手这对我来说是非常有用的.. – BALASCJP 2012-08-16 19:32:36

+0

@BALASCJP - 什么样的一个例子,到底是什么?在一个事务中修改两个不同表中的数据(恰好在同一个模式中)?你使用直接JDBC吗? JPA?或者其他一些API来访问数据库?在两个不同的表(即恰好是在同一个模式)在单个事务 – 2012-08-16 19:40:03

+0

-Modifying数据...我使用直JDBC – BALASCJP 2012-08-16 19:41:37

1

设置你的Connection所以它不会自动提交(其中它在默认情况下),例如:

conn.setAutoCommit(false); 

然后你就可以对第一个模式运行DML,并使用相同的连接对象,运行针对第二个模式的DML。如果事情失败,滚一切恢复,e.g:

conn.rollback(); 

否则,如果一切完成,提交:

conn.commit(); 
+0

GriffeyDog我们不能访问两个架构与单一的连接,但我们可以通过单一的交易实现它好的,如果我错了。 – BALASCJP 2012-08-16 20:35:08

+1

好的,所以您听起来像是直接连接到两个模式中的每一个,并使用JDBC数据库连接。我建议设置一个单独的模式,您的应用程序可以使用该模式连接到Oracle数据库,并为您需要访问的任何数据库对象的现有两个模式授予适当的特权,以根据需要创建同义词。那么你将只需要一个JDBC连接。 – GriffeyDog 2012-08-17 14:19:57