2017-05-21 3 views
0

私はストアド・プロシージャを使用してAvailable_Ticketsテーブルから「Random」行を選択します。選択した後、その番号を好きなユーザーはチケットを購入します。テーブルから削除されます。ユーザーが選択した行が削除されて返された番号に同意すれば、PL/SQLプロシージャ・データのフリーズ(ランダムロット・チケットの予約)

CREATE OR REPLACE GET_RANDOM_TICKET (RESULT OUT INTEGER) IS 
co,mn,mx integer; 
BEGIN 
SELECT COUNT(ID) , MIN(ID) ,MAX(ID) INTO CO,MN,MX FROM TICKETS; 

SELECT TICKET_NUMBER INTO RESULT FROM (
    SELECT TICKET_NUMBER 
     FROM TICKETS WHERE ID >= DBMS_RANDOM(MN,MX) 
) WHERE ROWNUM = 1; 
END GET_RANDOM_TICKET; 

私の手順は、次のようになります。 最初のselect文を実行した後にmax(id)を持つ行が削除される最悪の場合がありますか?

編集1 ---- SELECTの2つのステートメントは、同じデータがテーブルの変更を反映して表示されますか?なぜ?

答えて

0

1)ユーザが自分の選択を確認するまで、返されたチケットを予約済みとマークするための列(チケットステータス[フリー、予約済み])を追加します。 2)そのチケットのステータス列をユーザーに返却した後で更新する - 無料チケットの条件を追加する 3)チケットのステータスを確認した後、チケットのステータスを再度チェックしてください。 (2人のユーザーが同じ時間にプログラムを実行し、チケットがもう予約されていないので、同じ番号を取得すると非常にスリムなチャンスで番号を取得し、もう1つはエラーメッセージが表示されます)

希望help

+0

答えにいくつかのコードを追加してもらえますか?私は、削除がプロシージャの外で行われていることに気付かれたいのですが、私はそれをアップデートに変更し、ロックを維持しますか? – alibttb

+0

あなたは削除する必要はありません。将来の参照のために販売されている状態で保管することができます。 –

関連する問題