1

我想要的是能夠從表中讀取舊數據,而某些事務正在寫入同一個表。當這種原子寫作完成後,我想用新的數據替換舊數據。從表中讀取舊數據,而某些事務正在寫入同一個表

我正在處理的交易很長,我不希望啓用髒讀或阻止閱讀的可能性。

我打開快照隔離級別上我的數據庫:

SET ALLOW_SNAPSHOT_ISOLATION ON 

和使用這樣的代碼寫在交易數據:當我想讀一些

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, 
         new TransactionOptions 
          { IsolationLevel = IsolationLevel.Snapshot })) 
{ 
    update(); 
    scope.Complete(); 
} 

不幸數據使用Microsoft SQL Server Management Studio中的SELECT * FROM [Table],查詢執行正在等待,並顯示消息Executing query...,並在事務完成後檢索數據。我錯過了什麼?

編輯:更新的模式()碼 - 一個循環中基本的簡單的插入,與WCF沒有連接數據庫相關的東西,這將會減慢的過程中混合

var val = Web.Download(); 
using (var connection = new SqlConnection(connection)) 
{ 
    connection.Open(); 
    using (var command = connection.CreateCommand()) 
    { 
     command.CommandType = CommandType.Text; 
     command.CommandText = "INSERT INTO [table]([value]) VALUES (@val)"; 
     command.Parameters.Add(CreateParam(command, "@val", val, DbType.String)); 
     command.ExecuteNonQuery(); 
    } 
} 
+0

你的update()方法做了什麼(請發佈相關代碼)?在Management Studio中,使用(nolock)或SELECT * FROM [Table](read_uncommitted)運行SELECT * FROM [Table]不應該掛起 – jbl

+0

如果我使用SELECT * FROM [Table]和(nolock),我可以獲取數據插入時,事務範圍內的代碼仍在進行中。中止後,事務回滾的地方,這些數據將消失。所以在我的理解中,我能夠做到骯髒的閱讀,這是我想要避免的。我只想讀取舊的一致狀態。我希望新數據僅在提交後纔可用於讀取。 – jwaliszko

+0

然後我猜你應該使用SET READ_COMMITTED_SNAPSHOT ON; (請參閱http://msdn.microsoft.com/en-us/library/ms179599%28v=sql.105%29.aspx)或按照@flup建議的方式進行操作 – jbl

回答

1

您需要設置隔離級別爲您的選擇了。 在您的SELECT * FROM [Table]之前,請添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT

+0

謝謝,在SELECT返回保存的數據之前設置此隔離級別快照。你知道爲什麼當我從表中選擇數據時,它不是默認行爲,而對於這樣的表正在進行事務並且其快照存在? – jwaliszko

+0

默認隔離級別是Read committed。 – flup

相關問題