原子的に保持カウンター用サブソニックActiveRecord
-
26-09-2019 - |
質問
私はそうとしていることから、原子的に増分値、カウンター一つのテーブルを使用する増分値としての擬似的なディスプレイ専用の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社)
保存のレコードjob_number=0
更新記録このようになっ
更新の仕事セットJOB_NUMBER= (選択MAX(job_number)+1から仕事がcompany_id=12345) がjob_id="+これです。job_id;
(ごみに変換する必要があるのはこのクエリーの亜音速ダイアゴナル構文では利用しないsubsonic3) ることを保証する仕事の数は、各会社の場合はラップともに保存-更新のコマンドの取引により、使用テーブルをロック).
他のヒント
大容量のマルチユーザシステム上に危険な(潜在的な重複した値)とすることができる現在の最高値を取得するために動的コードを使用します。
別のアプローチは、2つのカラムを持つ新しいテーブルを作成することができ、 1文字PK、および関連する最後の値を格納するための他の整数。あなたは、新しい値をしたいたびに、関連会社のためにレコードの値をインクリメントし、あなたの注文番号のためにその値を使用します。文字PKのようなものを含んでいます。
"LAST_ORDER_NUMBER_COMPANY_" + company_id
私は、自動的にどちらかの新しいレコードに会社が注文を持っている、またはそれ以降の受注のために刻み、それを、そして新たな注文番号値裏を返す最初の時間を開始するコールにストアドプロシージャています。