1

一意としてマークされたプロパティを持つ同じタイプのオブジェクトのいくつかの同時挿入を実行する可能性のあるマルチスレッドアプリケーションがあります。

public class Foo(){
...
    string PropertyThatshouldBeUnique {get;set;}
...
}

各スレッドには独自のセッションがあり、次のことを行います。

Foo myFooInstance = new Foo();
myFooInstance.PropertyThatshouldBeUnique = "Bar";
myThreadSession.SaveOrUpadte(myFooInstance);
  • データベーステーブルに一意の制約があり、複数の挿入を防止しているため、トランザクション全体のロールバックをトリガーする2番目の挿入で例外が発生します(これは適切ではありません)
  • 同時挿入は非常に近くなる可能性があります(数ミリ秒)
  • 特定のNhibernate同時実行戦略を構成していません(これで問題が解決するかどうか、またはどちらを使用するかはわかりません)

私の問題は:

コードのどこで、同じプロパティ値を持つ以前に挿入されたFooオブジェクトを確認する必要がありますか?

4

2 に答える 2

0

現在のアーキテクチャを壊さずに、NHibernate でこのようなことを行うことはできますか?

if(!Update(connection))
{
    using (var command = new SqlCommand(@"INSERT INTO foo VALUES (Bar, ...)", connection))
    {
        try
        {   
            command.ExecuteNonQuery(); 
        }               
        catch (BlahUniqueConstraintException) // dummy exception, please replace with relevant
        {
            // very rarely will get in here
            Update(connection);
        }           
    }
}           

private bool Update(SqlConnection connection)
{
    // use update to do two things at once: find out if the record exists and also ... update
    using (var command = new SqlCommand(@"UPDATE foo SET ... WHERE PropertyThatshouldBeUnique = 'Bar'", connection))
    {
        // if the record exists and is updated then returns 1, otherwise 0
        return command.ExecuteNonQuery() > 0;
    }   
}
于 2012-06-07T00:40:45.310 に答える