重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

データベースを勉強しているものです.
勉強の題材としてWEBアプリで予約システムみたいなものを作ってみているのですが,正規化したテーブルに対してデータを追加する際にどのようにすればいいのか悩んでいます.

予約tableと予約詳細tableを作り,予約IDで関係付けようと思っているのですが,
予約が入った際に予約tableのデータをinsertしてから予約詳細tableにinsertをすると思われます.このとき,予約詳細tableにデータをinsertする際に予約IDをどのように入れたらいいでしょうか.

1.トランザクション開始
2.予約IDを払い出し(WebAP上の変数で保持する)
3.予約tableに予約IDと登録するデータをinsert
4.予約詳細tableに予約IDと登録するデータをinsert
5.コミット

これをやってしまうと予約IDが別のセッションで同じIDになってしまう恐れがあります.
どうしたらいいでしょうか.

予約IDテーブルでも作って,払い出した際に,他のセッションに奪われないように作るなどの方法をとればいいのでしょうか.

A 回答 (2件)

パフォーマンス重視、予約IDに空き番が出ててもいいならシーケンスが一番いいと私も思います。


予約IDに空き番が出ると困るなら、仕方がないので予約IDテーブル(1レコード)を作成し
トランザクション開始
UPDATE RETURNNING か UPDATE して SELECT で予約IDを取得
予約テーブルと予約明細テーブルにINSERT
COMMIT or ROLLBACK
なら後続トランザクションは予約IDテーブルのUPDATEでWAITになるから重複は発生しない。
(その代わりにここがボトルネックになる危険がある)
    • good
    • 0

PostgreSQL や Oracle であればシーケンスを使ってIDを生成するのが一番簡単な方法でしょう。


シーケンスは並行して複数のトランザクションから取得しても必ず一意になります。

http://www.postgresql.jp/document/9.1/html/funct …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!