Блокировка таблиц и транзакции 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;

Корректно ли реализована блокировка таблицы для случая с двумя менеджерами и одним и тем же туром, или нужно иначе блокировать?


Ответы (0 шт):