SELECT FOR UPDATE SKIP LOCKED does not work as expected
437457Feb 11 2009 — edited Feb 11 2009Hi Gurus,
I have a table like below to implement Seat stock taking :
(the table below is simplified form, just to explain the requirement )
CREATE TABLE SEAT_STOCK
(
ROOM_ID NUMBER(12) PRIMARY KEY,
ROOM_NO VARCHAR2(5 CHAR) NOT NULL, -- room number
SEAT_NO VARCHAR2(1 CHAR) NOT NULL, -- seat number : A,B.C,D etc
ROOM_TYPE VARCHAR2(1 CHAR), -- Room Status [N]Neutral, [M]ale, [F]emale
SEAT_STATUS VARCHAR2(1 CHAR), -- Unoccupied, [O]ccupied
PSG_STATUS VARCHAR2(1 CHAR), -- Passenger Status : [M]ale, [F]emale
PSG_NAME VARCHAR2(30 CHAR) -- Passenger Name
);
begin
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (1, '101', 'A', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (2, '101', 'B', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (3, '101', 'C', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (4, '101', 'D', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (5, '101', 'E', 'N', 'U');
--
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (6, '201', 'A', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (7, '201', 'B', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (8, '201', 'C', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (9, '201', 'D', 'N', 'U');
INSERT INTO SEAT_STOCK(ROOM_ID, ROOM_NO, SEAT_NO, ROOM_TYPE, SEAT_STATUS) VALUES (10,'201', 'E', 'N', 'U');
end;
SELECT * FROM SEAT_STOCK
WHERE SEAT_STATUS = 'U'
AND ROWNUM <= 3
FOR UPDATE SKIP LOCKED
The result of the query is 3 rows and I expect only those 3 rows is Locked,
but what I get is is all 10 rows with SEAT_STATUS = 'U' is locked.
Is it possible to ONLY lock the 3 rows that is resulted from the query ?
(this is simulation of multi user stock taking, if there is 3 users, each requested 3 seats, all will get different 3 rows
without waiting each other to commit. )
Thank you for your help,
xtanto