Блокировка таблиц и транзакции PL/SQL
Было дано задание реализовать заказ туров в туристическом агентстве. Опустим подробности предметной области. Сама таблица представляет из себя вот что:
CREATE TABLE tour_order (
operation_id INTEGER NOT NULL,
tour_date DATE NOT NULL,
service_name VARCHAR2(50) NOT NULL,
tour_type VARCHAR2(50) NOT NULL,
client_client_id INTEGER NOT NULL,
manager_manager_id INTEGER NOT NULL
ALTER TABLE tour_order
ADD CONSTRAINT tour_order_pk PRIMARY KEY ( operation_id,
service_name,
tour_type,
client_client_id,
manager_manager_id);
Сказали реализовать систему скидок в хранимой процедуре, а также предусмотреть ситуацию, когда в БД одновременно вносятся одинаковые данные с двух сессий (к примеру два менеджера оформляют один и тот же тур на одного и того же клиента в одно и то же время), а также применение транзакций (как я поняла, просто COMMIT после всех INSERT).
Сам код процедуры:
create or replace PROCEDURE Tour_Ordering
(opID IN NUMBER, datee IN Date, svName IN VARCHAR2, totp IN VARCHAR2, clID IN NUMBER, mgID IN NUMBER)
IS
countOfExisting NUMBER;
tourExisting EXCEPTION;
doc CHAR;
age NUMBER;
tour_price NUMBER;
BEGIN
LOCK TABLE TOUR_ORDER IN SHARE ROW EXCLUSIVE MODE NOWAIT;
Select Count(*) into countOfExisting from tour_order tord where clID = tord.client_client_id and datee = tord.tour_date;
IF countOfExisting <> 0 THEN
RAISE tourExisting;
ELSE
Select client.age, client.preferential_document INTO age, doc from client where client.client_id = clID;
Select tour.price INTO tour_price from tour where tour.type = totp;
if(age > 50 and doc = 0) then
INSERT INTO TOUR_ORDER(OPERATION_ID, TOUR_DATE, SERVICE_NAME, TOUR_TYPE, CLIENT_CLIENT_ID, MANAGER_MANAGER_ID, SUMMARY_PRICE)
VALUES (opID, datee, svName, totp, clID, mgID, tour_price - (tour_price * 0.3));
end if;
if(age > 50 and doc = 1) then
INSERT INTO TOUR_ORDER(OPERATION_ID, TOUR_DATE, SERVICE_NAME, TOUR_TYPE, CLIENT_CLIENT_ID, MANAGER_MANAGER_ID, SUMMARY_PRICE)
VALUES (opID, datee, svName, totp, clID, mgID, tour_price - (tour_price * 0.45));
end if;
if(age < 50 and doc = 1) then
INSERT INTO TOUR_ORDER(OPERATION_ID, TOUR_DATE, SERVICE_NAME, TOUR_TYPE, CLIENT_CLIENT_ID, MANAGER_MANAGER_ID, SUMMARY_PRICE)
VALUES (opID, datee, svName, totp, clID, mgID, tour_price - (tour_price * 0.45));
end if;
if(age < 50 and doc = 0) then
INSERT INTO TOUR_ORDER(OPERATION_ID, TOUR_DATE, SERVICE_NAME, TOUR_TYPE, CLIENT_CLIENT_ID, MANAGER_MANAGER_ID, SUMMARY_PRICE)
VALUES (opID, datee, svName, totp, clID, mgID, tour_price);
end if;
COMMIT;
END IF;
EXCEPTION
WHEN tourExisting THEN
raise_application_error(-20000, 'Тур для пользователя на эту дату уже забронирован!');
END;
Корректно ли реализована блокировка таблицы для случая с двумя менеджерами и одним и тем же туром, или нужно иначе блокировать?