2017-05-21 23 views
0

我正在使用存储过程从Available_Tickets表中选择一个“随机”行,选择后如果用户喜欢该数字,并购买票据,该行将为从表中删除。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语句会不顾表中的变化而看到相同的数据?为什么?

回答

0

我会重新设计如下 1)增加一列(票状态[免费,保留,出售])来标记返回的票证为保留,直到用户确认他的选择 2)使用游标具有用于更新子句在将其返回给用户后更新该票状态列 - 还添加免费票的条件 3)在用户确认后再次检查票状态,如果它仍然保留,则更新为出售。 (在2个用户同时运行该程序并获得相同号码的非常渺茫的机会中,其中一个将获得该号码,另一个应该接收到错误消息,因为该票不再保留。

希望帮助

+0

请问您可以在答案中添加一些代码,我希望您注意,删除是在程序之外完成的,所以如果我将其更改为更新,并在程序中选择'for update',那么保持锁? – alibttb

+0

对不起,你不需要删除,你可以将它保存为未来引用的状态,正如我之前提到的,你可以根据你的条件状态来确定票状态 –