質問

私はそうとしていることから、原子的に増分値、カウンター一つのテーブルを使用する増分値としての擬似的なディスプレイ専用のIDを記録しています。

私は会社で仕事をする。たい各社で定めた自job_numbers.いて自動車の増分job_idが、その数ているのは企業です。ie:仕事の数は一般的に増分な隙間の各会社です。

ie:

  • 企業company_id,next_job_number)
  • (company_id,job_id,job_number)

現在のとなっているこの方法としては、一部をジョブクラス):

public void SaveJob()
{
    using (var scope = new System.Transactions.TransactionScope())
    {
        if (job_id == 0)
        {
            _db.Update<company>()
                .SetExpression("next_job_number").EqualTo("next_job_number+1")
                .Where<company>(x => x.company_id == company_id)
                .Execute();

            company c = _db.companies.SingleOrDefault(x => x.company_id == company_id);

            job_number = c.next_job_number;
        }

        // Save the job
        this.Save();

        scope.Complete();
    }
}

もう、うまく落とし穴があり。それだけで感じ間違いがなんなのかどうかのことを思い出します。

アドバイスください。

役に立ちましたか?

解決

第一に、

を使用するのはTransactionScopeとSharedDbConnectionScopeやお取引が成り立たないと思うとして期待される。

第二に、

として使おうという試みの一つとなく保存のjob_id社)

  1. 保存のレコードjob_number=0

  2. 更新記録このようになっ

    更新の仕事セットJOB_NUMBER= (選択MAX(job_number)+1から仕事がcompany_id=12345) がjob_id="+これです。job_id;

(ごみに変換する必要があるのはこのクエリーの亜音速ダイアゴナル構文では利用しないsubsonic3) ることを保証する仕事の数は、各会社の場合はラップともに保存-更新のコマンドの取引により、使用テーブルをロック).

他のヒント

大容量のマルチユーザシステム上に危険な(潜在的な重複した値)とすることができる現在の最高値を取得するために動的コードを使用します。

別のアプローチは、2つのカラムを持つ新しいテーブルを作成することができ、 1文字PK、および関連する最後の値を格納するための他の整数。あなたは、新しい値をしたいたびに、関連会社のためにレコードの値をインクリメントし、あなたの注文番号のためにその値を使用します。文字PKのようなものを含んでいます。

"LAST_ORDER_NUMBER_COMPANY_" + company_id

私は、自動的にどちらかの新しいレコードに会社が注文を持っている、またはそれ以降の受注のために刻み、それを、そして新たな注文番号値裏を返す最初の時間を開始するコールにストアドプロシージャています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top