1

コンサートの座席や航空券をオンラインで注文する場合、レコード レベルのロックが必要ですか、それともトランザクションで十分ですか?

コンサートのチケット(例えば座席番号20B)や航空券(例えばオーバーブッキングでも制限は210)の場合、ウェブサイトはチケット購入画面を表示したときにレコードをロックしたり、トランザクションを開始したりできないと思います。

しかし、ユーザーが「購入の確認」をクリックした後、サーバーはトランザクションを開始し、座席番号 20B を購入して、コミットを試みる必要があります。

別のユーザーが以前のトランザクションでシート 20B を既に購入している場合、現在のトランザクションが失敗するのは「コミット」部分ですか?

では... レコード レベルのロックは必要ないのでしょうか? トランザクションは常に (次々に) シリアル化されるので、「競合状態」がないことを確認できますか? では、どのような状況でレコード レベルのロックが必要になるのでしょうか?

4

1 に答える 1

0

行を挿入する前に、同じ SeatId を持つエントリが存在する場所を確認できます。存在する場合はロールバックし、そうでない場合は行を挿入してコミットします。私は自信がないので、サービスが非常に忙しい場合は、挿入操作を開始する前にロックする必要があると思います。

ただし、エキサイティングな 2 番目のオプションがあります。

この 2 つで を維持しshowIdseatId インデックスを作成します。このインデックスに一意の制約を作成します。次に、ロックを使用してトランザクションを開始します。重複が存在する場合。一意の制約のために明らかに失敗します。そしてコミットは失敗します。

ニール

于 2010-07-02T17:22:14.903 に答える