PL/SQL程序数据冻结(预约随机乐透)
PL/SQL Procedure data freezing (reserving random lotto ticket)
我正在使用存储过程 select 来自 Available_Tickets table 的 "Random" 行,如果用户喜欢这个数字,selection 之后,并购买机票,该行将从 table.
中删除
我的程序是这样的:
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;
如果用户同意返回的数字,则删除 selected 行。
我可以在执行第一个 select 语句后删除带有 max(id) 的行的最坏情况吗?
编辑1----
尽管 table 发生了变化,但两个 SELECT
语句会看到相同的数据吗?为什么?
我会重新设计如下
1)添加一列(门票状态[free,reserved,sold])将返回的门票标记为已预订,直到用户确认他的选择
2) 在将票证状态列返回给用户后,使用带有 for update 子句的游标来更新该票证状态列 - 还为免费票证添加 where 条件
3) 用户确认后再次查看门票状态,如果仍然保留则更新为已售出。 (在极少数情况下,2 个用户 运行 该程序同时获得相同的号码,其中一个将获得该号码,另一个应该收到错误消息,因为票不再保留。
希望有所帮助
我正在使用存储过程 select 来自 Available_Tickets table 的 "Random" 行,如果用户喜欢这个数字,selection 之后,并购买机票,该行将从 table.
中删除我的程序是这样的:
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;
如果用户同意返回的数字,则删除 selected 行。 我可以在执行第一个 select 语句后删除带有 max(id) 的行的最坏情况吗?
编辑1----
尽管 table 发生了变化,但两个 SELECT
语句会看到相同的数据吗?为什么?
我会重新设计如下 1)添加一列(门票状态[free,reserved,sold])将返回的门票标记为已预订,直到用户确认他的选择 2) 在将票证状态列返回给用户后,使用带有 for update 子句的游标来更新该票证状态列 - 还为免费票证添加 where 条件 3) 用户确认后再次查看门票状态,如果仍然保留则更新为已售出。 (在极少数情况下,2 个用户 运行 该程序同时获得相同的号码,其中一个将获得该号码,另一个应该收到错误消息,因为票不再保留。
希望有所帮助