2017-02-16 137 views
-2

我一直在閱讀事務隔離級別,我不確定我是否正確理解所有內容。我需要幫助。事務隔離級別問題

請考慮以下Csharp的僞代碼:

  1. 使用存儲過程1,打開事務
  2. 插入或更新表1
  3. 使用存儲過程2,插入或更新表2,基於數據在表1上
  4. 提交事務。

在步驟3中,我怎麼能不考慮在步驟2中更新的數據?我應該在我的.Net代碼中創建一個事務時設置事務隔離級別。這裏是SQL服務器存儲過程僞代碼。

select @count=count(*) from table1; 
if @count > 1 
update table2 
+0

澄清;你希望第3步看到表1中的數據是否與第2步之前的數據相同? –

+0

@DanDef:在10000英尺高度,這是真的。在100英尺的高度上,第3步要多得多,因此步驟的順序不能改變。 –

回答

1

只是改變順序不能解決您的問題?我的意思是,如果步驟2更改了表1的數據,並且您完全需要執行步驟3,請先執行步驟3。它應該是這樣的:

  1. 開放式交易
  2. 執行步驟2
  3. 執行步驟1
  4. 關閉交易

考慮你剛纔評論的東西,你可能會需要使用IsolationLevel.Snapshot。但是,某些數據庫默認情況下不會啓用此功能。當你更新源表時,它基本上創建了一個到tempdb的當前數據的副本。

+0

在10,000英尺的高度,你是對的。在100英尺的高度上,第3步要多得多,因此步驟的順序不能改變。 –

0

據我所知,沒有任何隔離級別允許您在修改後訪問行的先前版本。

要實現您所要求的,您需要修改第2步以跟蹤其已更改的內容並使其可用於第3步。否則,您需要將觸發器添加到在第2步中修改的表中,並且跟蹤這種變化。