1

新しい領収書を作成するために、ユーザーが購入するたびにテーブルreceipt_counterから現在最高の番号を取得するというクエリがあります。毎年リセットされるため、テーブル内で一意ではありません。 receiptsreceipt_counter

receipt_counterreceipt_labelのように見える生成に使用される単なる整数です"pos_id"-"receipt_counter"
人々が同じ POS で同時に商品を購入できる可能性があります ( pos_id)。

new を取得する関数はreceipt_counter次のようになります。

SELECT (MAX(receipt_counter) + 1) as next_receipt_counter FROM receipts

問題は、複数の人が同時に製品を購入しているときに、新しいレシートの生成をトリガーすることです (レシート番号とともに)。レシート カウンターの取得と新しいレシートの挿入の間に遅延があるため、衝突が発生することがあります (複数の人が同じレシート番号を取得します)。 DB。

この種の問題に対処するためのベスト プラクティスはありますか? ある種のデッドロックを使用する必要がありますか、それとも最初のアイデアに欠陥があり、受信カウンターを生成するための戦術をすべて変更する必要がありますか?

EDIT:recipe_counterは、ギャップのない連番である必要があります。

4

3 に答える 3

1

id のみの別のテーブルを作成し、その id 列で auto_increment を有効にすることができます。次に、2 つのステップで領収書を追加します。最初に新しいレコードを ID テーブルに追加し、生成された ID を受け取ります。次に、受け取った ID を使用して実際の領収書を追加します。次に、インクリメントカウンターをリセットしたいときに、IDでテーブルを切り捨てる必要がある場合。

于 2013-11-13T13:16:21.957 に答える
1

レシート カウンターを取得してから新しいレシートを DB に挿入するまでに多少の遅延があります。

ソフトウェアを変更して、実際の領収書を作成せずに ID を取得するか、代わりに領収書を作成し (「保留中」状態など)、その ID を取得することができます。現在領収書を作成している時点で、そのステータスを「アクティブ」または何かに設定するだけです。

このようにすることで、ID の取得とレコードの保存の間のこの時間のギャップを取り除くことができます。私の観点では、これが問題の主な原因です。

于 2013-11-13T13:30:05.453 に答える
0

隙間なくreceipt_counter増えていく必要があるのか​​?

ギャップのある大きな数値が増えても問題ない場合は、現在の日付/時刻から数値を生成するのはどうですか? ミリ秒またはナノ秒まで下げると、衝突の可能性はかなり低くなります。

例えば:

2013-11-13 13:08:15.012-> 1113130815012
(とにかく毎年番号がリセットされると言っていたので、年を省略しました)

于 2013-11-13T13:19:46.693 に答える