2012-08-16 71 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