我想要的是能夠從表中讀取舊數據,而某些事務正在寫入同一個表。當這種原子寫作完成後,我想用新的數據替換舊數據。從表中讀取舊數據,而某些事務正在寫入同一個表
我正在處理的交易很長,我不希望啓用髒讀或阻止閱讀的可能性。
我打開快照隔離級別上我的數據庫:
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();
}
}
你的update()方法做了什麼(請發佈相關代碼)?在Management Studio中,使用(nolock)或SELECT * FROM [Table](read_uncommitted)運行SELECT * FROM [Table]不應該掛起 – jbl
如果我使用SELECT * FROM [Table]和(nolock),我可以獲取數據插入時,事務範圍內的代碼仍在進行中。中止後,事務回滾的地方,這些數據將消失。所以在我的理解中,我能夠做到骯髒的閱讀,這是我想要避免的。我只想讀取舊的一致狀態。我希望新數據僅在提交後纔可用於讀取。 – jwaliszko
然後我猜你應該使用SET READ_COMMITTED_SNAPSHOT ON; (請參閱http://msdn.microsoft.com/en-us/library/ms179599%28v=sql.105%29.aspx)或按照@flup建議的方式進行操作 – jbl