2016-07-01 17 views
-1

我正在通過C#應用程序對數據庫執行存儲過程。我想在存儲過程執行後進行計算,然後在計算完成後,我想將數據庫回滾到存儲過程之前的狀態。我在堆棧溢出中看到的大多數示例只涉及在發生錯誤時使用try/catch塊的catch塊中的回滾,但這與我正在做的不同。如何執行存儲過程,然後在以後回滾更改?

我不知道我是否應該在某個時刻保存數據庫的狀態,然後以該狀態進行事務回滾,或者應該將事務參數附加到存儲過程的實例SqlCommand,或者是其他東西。

回答

0

您可以通過交易完成此操作。示例在這裏:https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx是的,它也使用catch塊,但你不必。

或者,如果您的SQL Server版本支持它們,您可以使用數據庫快照,但是它們將回滾所有因爲時間快照而發生的更改 - 您和任何其他用戶。很可能這不是你想要的。

0

一種選擇是將WAITFOR DELAY與修改的事務隔離級別結合使用。它做的是執行你的代碼,使查詢等待一段時間,然後回滾事務。在此期間,您可以指定,您可以從表中獲得另一個會話查詢(只要您將事務級別設置爲未提交讀取),並且您將能夠看到新值。下面是一個示例:

在一個窗口SSMS的:

CREATE TABLE ##testtable (id INT); 

BEGIN TRAN; 

INSERT INTO ##testtable (id) 
VALUES (1), (2), (3); 

WAITFOR DELAY '00:01:00'; 
ROLLBACK TRAN 

在第二SSMS窗口,運行1分鐘時間範圍內此查詢:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

SELECT * 

FROM ##testtable 

在1分鐘使其他窗口正在執行,您將在臨時表中看到值。一分鐘後,表格將爲空白。這適用於一些簡單的任務,但是如果您正在對已經有測試更改的數據進行測試,那麼只需執行快照或數據庫恢復即可。

0

標準免責聲明:這可能不是一件好事。 (好的,完成了。)

您可以在存儲過程中使用table variable最簡單地完成此操作。您可以

開始交易
修改數據
查詢修改後的數據
將其插入到表變量
回滾事務
選擇什麼在表變量

declare @myData table (someColumn int, someOtherColumn varchar(10)) 

begin transaction 

begin try 
    [make your changes] 

    insert into @myData 
    select something, something something 

    rollback transaction 

    select * from @myData 
end try 
begin catch 
    rollback transaction 
end catch 

滾動返回你的事務不會影響表變量的內容。我相信這不僅僅是依靠我的應用程序來回滾事務。並不是說這樣做不行,但我只是相信這一點。這就是說,你可以創建一個SqlTransactiondocs),使用該事務執行你的SqlCommand,查詢你的數據,然後回滾事務。

相關問題