ここでは、次のようにトランザクションスコープを使用してタイプ transactionSummary のドキュメントを保存しています
public class TransactionSummary
{
[JsonIgnore]
public Guid? Etag { get; set; }
public String Id { get; set; }
public String TransactId { get; set; }
public OpenOrClosed BalanceType { get; set; }
public TransactStatus Status { get; set; }
public String PayeeAccountNo { get; set; }
public Decimal AmountPaid { get; set; }
}
using (var trans = new TransactionScope())
{
using (IDocumentSession sess = GetConnection())
{
sess.Store(fldtrans);
sess.SaveChanges();
}
trans.complete();
}
すぐに保存した後、取得する必要があるため、次のようにしています
using (IDocumentSession sess = GetConnection())
{
sess.Advanced.AllowNonAuthoritativeInformation = false;
sess.Advanced.UseOptimisticConcurrency = true;
transact = sess.Query<TransactionSummary>().Where(x => x.TransactId ==transactid).FirstOrDefault();
transact.Etag = sess.Advanced.GetEtagFor(transact);
}
ここで、次のような例外が発生します ex = {"Value cannot be null.\r\nParameter name: key"}StackTrace = "
at System.Collections.Generic.Dictionary 2.FindEntry(TKey key)\r\n at System.Collections.Generic.Dictionary
2.TryGetValue(TKey key, TValue& value)\r \n c の Raven.Client.Document.InMemoryDocumentSessionOperations.GetDocumentMetadata[T](T インスタンス) で...
トランザクションのコミットには一定の時間がかかるため、ドキュメントをすぐに読み取ると失敗することを理解しています。しかし、私の要件を犠牲にしないように、どうすればこれを克服できますか。
Matt ここで、私はそのトランザクション スコープで他の多くの作業も行っています。その 1 つを理解するために、TransactionId をキューに投稿し、バックグラウンド サービスが transactionId (ドキュメントではなくId) を実行し、トランザクション後に実行する必要がある他のプロセスを実行します。ここでは、実際のデータベースでトランザクションが影響を受ける前に、キューが transactionId を取得します。
これは、参照用の Getconnection コードです。
public class DataAccess : IDataAccess
{
static IDocumentStore _docStore ;
public DataAccess()
{
_docStore = new DocumentStore { Url = "http://localhost:8081" };
_docStore.Initialize();
_docStore.Conventions.IdentityPartsSeparator = "-";
}
#region IDataAccess Members
public IDocumentSession GetConnection()
{
IDocumentSession sess = _docStore.OpenSession();
_docStore.DatabaseCommands.EnsureDatabaseExists("MyDB");
return sess=_docStore.OpenSession("MyDB");
}