RavenDBを使用するとIDocumentSession
、アプリの起動時に作成し(アプリが閉じられるまで閉じない)、次のようにして楽観的同時実行性を使用できます。
public class GenericData : DataAccessLayerBase, IGenericData
{
public void Save<T>(T objectToSave)
{
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
Session.Store(objectToSave, eTag);
Session.SaveChanges();
}
}
別のユーザーがそのオブジェクトを変更した場合、保存は正しく失敗します。
しかし、アプリの存続期間中に1つのセッションを使用する場合、私ができないことは、アプリの他のインスタンス(たとえば、5キュービクル離れたジョー)によってドキュメントに加えられた変更を確認することです。これを行うと、ジョーの変更が表示されません。
public class CustomVariableGroupData : DataAccessLayerBase, ICustomVariableGroupData
{
public IEnumerable<CustomVariableGroup> GetAll()
{
return Session.Query<CustomVariableGroup>();
}
}
注:これも試しましたが、Joeの変更も表示されませんでした。
return Session.Query<CustomVariableGroup>().Customize(x => x.WaitForNonStaleResults());
さて、IDocumentSession
逆に、データベースにアクセスするすべてのメソッド内に作成すると、逆の問題が発生します。新しいセッションがあるので、ジョーの変化を見ることができます。Buuuuuuut...それから私は楽観的同時実行性を失います。保存する前に新しいセッションを作成すると、この行は空のGUIDを生成するため、失敗します。
Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave);
私は何が欠けていますか?各メソッド内でもアプリレベルでもセッションを作成するべきではない場合、正しいスコープは何ですか?Session.Query()を実行するときに、楽観的同時実行性と他のユーザーの変更を確認する機能の利点をどのように得ることができますか?