2017-06-01 55 views
0

假設我有多個存儲過程從c#代碼執行的代碼。每個存儲過程在發生異常情況下都有提交和回滾。在這些存儲過程中處理異常並返回處理的錯誤消息。如果我有一個OracleTransaction.BeginTransaction()「運行」,在執行存儲過程的同一個連接對象上時,C#代碼中的OracleTransaction.Rollback()實際上會回滾由先前執行的存儲過程所提交的數據。OracleTransaction.Rollback()是否取代存儲過程中的提交?

邏輯如下:

  1. 打開連接
  2. 開始交易
  3. 執行一個存儲的程序(具有提交內部)
  4. 如果都好,執行另一個存儲過程(與提交)。如果不是,則回滾以前的存儲過程並完全停止。
  5. 沒有錯誤提交事務。 謝謝。
+3

您似乎以非標準方式使用術語「事務」(與使用數據庫的上下文中的技術含義不一致)。您不在「交易」中「執行存儲過程」;相反,反過來。你只能提交一個事務 - 一旦提交,它就不能被回滾。問題是,如果第二個程序中的某些內容可能要求您撤消第一個程序中完成的內容,那麼爲什麼在第一個程序結束時有COMMIT開始? – mathguy

+1

有誰知道OracleTransaction.BeginTransaction是做什麼的?從快速搜索中我只能發現它在數據庫_上開始了交易。但是,在Oracle中沒有特殊的命令來做到這一點。我懷疑它什麼都不做,純粹是爲了與其他RDBMS產品兼容而提供的。 –

+0

@mathguy不幸的是,這是我必須處理的數據結構,這部分是一個無法解決的設計問題。第二個程序曾經是第一個程序的內部,並將在其中承諾。該查詢必須被帶入它自己的SP中,但是數據是相互依賴的,如果第二次失敗,則需要先回滾。我希望實現嵌套交易,因爲它是唯一想到的事情。但是,我確實發現這個https://stackoverflow.com/questions/24506847/using-nested-transactions-in-oracle,它基本上關閉了這個問題。 – KonB

回答

2

A COMMIT結束當前事務,並且新事務以下一個可執行SQL語句開始。因此後續的ROLLBACK只能撤消以前的以前的COMMIT,而不是之前的