2014-10-07 26 views
5

對我的問題:我從我的業務代碼調用存儲過程。這個調用是在一個明確的事務中。存儲過程有時會調用另一個將某些內容寫入數據庫。即使事務回滾,這些數據仍應保留在數據庫中。類似的情況是,當你想在日誌表中寫入內容時,應該保留日誌消息(這不是我的情況,它只是一個類似的需求)。我可以從MS SQL中的事務中排除存儲過程嗎?

如何從外部事務中排除第二個存儲過程?我認爲我在尋找類似於Oracle中的「自治事務」的東西。我尋找一個可能的仿真,但所有的解決方案看起來都不是很好(創建一個環回服務器,添加一些.NET方法,...)

任何想法?謝謝!

+0

你見過這個:http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008。 aspx – Mohammadreza 2016-03-06 14:30:23

回答

0

據我所知,您不能從包含它們的事務中排除特定的操作。我的方法是嘗試明確地做你想做的事情,而不是回滾整個事務。或者,如果它是一個選項,則回滾事務,然後重新運行不想回滾的存儲過程。

+0

謝謝,但這不可行。存儲過程非常大,他們可以調用存儲過程多次存儲某些信息。這些信息必須保存在那裏,但其他所有可能的更改應該在出現問題時回滾。 – Raul 2014-10-08 08:05:09

1

這種類型的問題雖然看起來很普遍,但沒有優雅的解決方案。 begin transactioncommitrollback之間的所有內容均作爲一個整體完成。例如,您不能只將一行插入日誌表中,並在最終的rollback之後保留該行。

但你可以做一些技巧。

1)用xp_cmdshell調用你的過程來調用OSQL.exe。性能會很差,但外部命令不會參與事務,也不會阻止您從外部執行SQL語句。

2)在存儲過程中,您可以將記錄添加到表變量中而不是實際的表中。表變量不參與事務,因爲它們不會更改數據庫。之後以任何方式關閉事務後,將變量的內容追加到表中。 3)如果您不能更改內部程序,您可以將它可能創建的記錄取回到之後的表變量中,但是仍然在尚未處理的事務中創建。回滾事務並將提取的記錄再次附加到表中。

相關問題