3

受注処理システムを構築しています。処理サーバーのクラスターがあります。注文に読み取り可能な番号を割り当てる必要があります (例: ORD-000001、ORD-000002)。

これがシステム全体のロックを実装するのが難しいという主な問題。ロックの有効期限があるスキーマについて考えています。しかし、思いつくものにはまだボトルネックがあります。

DDDに近づいているため、データベースへの直接アクセスは困難です。NHibernate を使用しています。そして、UnitOfWork を使用します。

Pls、いくつかのアイデアを手伝ってください。すべてのアイデアは価値があります。トピックについて読むべき何かへのリンクはありますか?

更新: 連続番号が必要であることを強調したいと思います。そのため、高/低アルゴリズムを使用できません。現時点で、私はシナリオを調査しています。

  1. 「おそらく良い番号」を割り当てます。
  2. データベースにプッシュします。
  3. 失敗した場合は、別の「おそらく適切な番号」を割り当ててみてください。
  4. 成功した場合、コミットします。

しかし、私はそれのための良い技術を見つけることができません.

4

2 に答える 2

2

すべての注文に一意の番号が割り当てられていることを確認しようとしていますが、番号の分布を調整する中央の場所はありませんか?

2 つのオプションがあります。

  1. 現実的な期間に、最大で 10 台のサーバーがあると予想しているとします。各サーバーに ORD-XXXXXN の形式の連番を配布してもらいます。N はサーバーの番号です。したがって、サーバー 0 は ORD-000000、ORD-000010、ORD-000020 などを配布します。サーバー 6 は ORD-000006、ORD-000016、ORD-000026 などを配布します。

  2. 一度に 10000 の数字のブロックを配布します。各サーバーは、どこかでバックグラウンドで実行されている小さなサーバーからさらに取得する前に、ブロック内のすべての数値を使い果たします。小さなサーバーは、すべてのブロックを 1 つずつ実行し、一度に 1 つずつ渡します。最初に配布されるブロックは 0 ~ 9999、2 番目は 10000 ~ 19999、3 番目は 20000 ~ 29999 などです。

于 2009-09-21T20:08:13.527 に答える
1

念のため、本当に単一のデータベースを使用しているのであれば、なぜ

CREATE TABLE OrderNumbers (ID INT IDENTITY(1,1), Dummy VARCHAR(1))
INSERT INTO OrderNumbers (Dummy) SELECT ''
SELECT 'ORDER_N' + CONVERT(VARCHAR(50), @@IDENTITY) AS NewOrderNumber

更新: 異なるユーザー (マルチテナント) がいる場合でも、連番が +1 である必要がない場合、PK は機能します。つまり、1、2、3 だけでなく、1、4、10 を持つことができます。

更新:または、jpreteが提案したように、次のようにします:

CREATE TABLE CustomerOrderNumber (ID INT, CustomerID INT)
CREATE FUNCTION GetMaxId ( @mycustomerid INT ) RETURNS INT
AS BEGIN
 DECLARE @maxid INT
 SET @maxid = SELECT ID FROM CustomerOrderNumber WHERE CustomerID = @mycustomerid
 SET @maxid = @maxid + 1
 UPDATE CustomerOrderNumber SET ID = @maxid
 RETURN @maxid
END
于 2009-09-21T20:52:29.447 に答える