2

我想要的是能够从表中读取旧数据,而一些事务正在写入同一个表。当这样的原子写入完成后,我想用新的数据替换旧数据。

我正在处理的事务很长,我不想启用脏读,也不想阻止读取的可能性。

我在我的数据库上打开了快照隔离级别:

SET ALLOW_SNAPSHOT_ISOLATION ON

并使用这样的代码在事务中写入数据:

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

不幸的是,当我尝试使用SELECT * FROM [Table]Microsoft SQL Server Management Studio 读取一些数据时,查询执行正在等待消息Executing query...,并在事务完成后检索数据。我错过了什么?

编辑: update() 的代码 - 基本上是循环中的简单插入,混合了与 WCF 连接的没有 db 相关的东西,这会减慢进程:

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();
    }
}
4

1 回答 1

2

您还需要为您的选择设置隔离级别。在你之前SELECT * FROM [Table],添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT.

于 2013-01-14T12:12:46.910 回答