我想要的是能够从表中读取旧数据,而某些事务正在写入同一个表。当这样的原子写作完成时,我想用新的数据替换旧的数据。
我正在处理的交易很长,我不想启用脏读或阻止读取的可能性。
我已在我的数据库上打开了快照隔离级别:
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();
}
}
答案 0 :(得分:1)
您还需要为您的选择设置隔离级别。
在SELECT * FROM [Table]
之前,请添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT
。