私が欲しいのは、あるトランザクションが同じテーブルに書き込んでいる間に、テーブルから古いデータを読み取れるようにすることです。このようなアトミック書き込みが完了したら、古いデータを新しいデータに置き換えたいと思います。
私が対処しているトランザクションは長く、ダーティ読み取りを有効にしたり、読み取りの可能性をブロックしたりしたくありません。
データベースでスナップショット分離レベルをオンにしました。
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();
}
}