PL / SQL程序数据冻结(保留随机乐透票)

时间:2017-05-21 14:16:55

标签: sql oracle database-concurrency

我正在使用存储过程从Available_Tickets表中选择一个“Random”行,选择后如果用户喜欢该号码,并且购买该票证,该行将从表中删除。

我的程序如下:

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语句是否会在表中的更改中看到相同的数据?为什么?

1 个答案:

答案 0 :(得分:0)

我将重新设计如下 1)添加一个列(票证状态[免费,保留,售出])以将返回的票证标记为保留,直到用户确认其选择 2)使用带有for update子句的游标在将其返回给用户后更新该票证状态列 - 同时添加免费票证的where条件 3)用户确认后再次检查票据状态是否仍然保留然后更新为已售出。 (在2个用户同时运行程序并获得相同编号的非常可能的情况下,其中一个将获得该编号而另一个应该收到错误消息,因为该故障单不再保留。

希望得到帮助