Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

SELECT FOR UPDATE SKIP LOCKED does not work as expected

437457Feb 11 2009 — edited Feb 11 2009
Hi 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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Mar 11 2009
Added on Feb 11 2009
13 comments
4,226 views