始める前に、@Grumbler85に謝罪したいと思います-あなたは正しかったです。この質問はしばらくの間私を悩ませました、そして私は私ができる限り私の知識にそれを答えようとします。
トランザクションとロックの両方が不十分なソリューションです。
理由:テーブルをロックしたら、ロックを解除する必要があるため、ロックは適切ではありません。ロック解除は失敗する可能性があります。一般に、ネットワークとコンピューターの不安定な性質は誰もが知っています。つまり、ロックとロック解除を発行するには、C#アプリケーションを使用する必要があります。請求書を生成するたびに、カウンターとして使用されているテーブルをロックする必要があり、他のすべてのMySQLセッションはロックを解除するまで待機する必要があります。私の経験から、数日以内に、ロックを解除することを仕事とする管理者を雇う必要があります。
各トランザクションはデータのスナップショットで動作するため、トランザクションは十分ではありません(簡単な説明、トランザクション分離レベルは変更できます)。つまり、1つのトランザクションで請求書番号を6と計算でき、別のトランザクションでも請求書番号を6と計算できます。
できることは、invoice_numberを一意にすることです。これにより、2つ(またはそれ以上)のトランザクションが同じ番号を挿入しようとすると、少なくとも1つのトランザクションで例外が発生し、ギャップを防ぎますが、請求書の作成に失敗します。
auto_incrementを使用することもオプションではありません。Auto_incrementは単なるカウンターです。つまり、auto_incrementは、何らかの理由で削除された数値を「再利用」しません。これは、エラーが発生してトランザクションを保存できなかったため、そのレコードに対して計算されたauto_incrementが事実上失われるためです。
では、どのようなオプションがありますか?個人的には、事前定義された時間間隔で実行され、設定されていない請求書を更新する単純なサービスを作成しますinvoice_number
。このサービスは同時アクセスを提供せず、すでに挿入されている請求書のセットで機能する1つの接続が常にアクティブになります。
確かに(イギリスなどの特定の国では)請求書の番号付けを順番に行う必要があることを規定する法律がありますが、それについても間違っていました。出典:http ://www.hmrc.gov.uk/vat/managing/charge/vat-invoices.htmおよび出典からの抜粋:
一意で、前の請求書の番号に続く請求書番号-シリアル番号の付いた請求書を台無しにするかキャンセルする場合は、次回のVAT検査でVAT担当者に表示するために保持する必要があります
最後のオプションは、2つ以上のトランザクションが同じ請求書番号を取得した場合に請求書作成の失敗に満足することです。つまり、失敗したトランザクションを再実行する方法を実装する必要があります(これは単純ではありません)。