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 に答える