0

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

我的程序如下所示:

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尽管表中发生了变化,这两个语句会看到相同的数据吗?为什么?

4

1 回答 1

0

我将重新设计如下 1) 添加一列 (ticket status [free,reserved,sold]) 以将返回的门票标记为已保留,直到用户确认他的选择 2) 使用带有 for update 子句的光标来更新该门票状态列将其退还给用户后 - 还添加免费门票的条件 3)在用户确认后再次检查门票状态,如果它仍然保留然后更新为已售出。(如果 2 个用户同时运行该程序并获得相同的号码,则其中一个会得到号码,而另一个应该收到错误消息,因为门票不再保留。

希望有帮助

于 2017-05-21T20:23:13.023 回答