从表中读取旧数据,而某些事务正在写入同一个表

时间:2013-01-14 12:01:41

标签: .net transactions sql-server-2008-r2 transactionscope isolation-level

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

我正在处理的交易很长,我不想启用脏读或阻止读取的可能性。

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

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...,并在事务完成后检索数据。我错过了什么?

编辑: update()的代码 - 在循环中基本上是简单的插入,混合没有与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();
    }
}

1 个答案:

答案 0 :(得分:1)

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