как включить уровень изоляции в функцию psql - PullRequest
0 голосов
/ 20 апреля 2019
    CREATE OR REPLACE FUNCTION createNewOrder(userID text,currency text,orderAmount integer,price integer,isSell boolean,fast boolean) RETURNS integer AS $$
    DECLARE 
    asset record;
    newBalance integer;
    pairKey text;
    begin SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ write;
    --get user asset :
    select into asset getUserAssetEntity(userID);
    --check if asset not found :
    if not found then 
    rollback;
    return 101;
    end if;

    pairKey= asset.currency+"_payable" ;
    --check if asset is enoughf : 
    if pairKey >= orderAmount then 
    --create order  
    insert into public.order (pair,amount,price,remain,cdate,sell,cancel,fast,traderid,isactive,status)
    values (currency,orderAmount,price,orderAmount,NOW(),isSell,false,userID,true,"alive");

    --calculate new Balance :

    newBalance=asset.asset.pairKey - orderAmount;

    --update user asset :
    update public.asset set asset.pairKey = newBalance where id=asset.id;

    commit;
    return 103;

    else 
    rollback;
    return 102;
    end if;

    END; $$ 
    LANGUAGE 'plpgsql';

Я попытался использовать уровень изоляции в своей функции, и он возвращает эту ошибку:

ошибка: УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ должен быть вызван перед любым запросом

1 Ответ

0 голосов
/ 21 апреля 2019

Прежде всего, вы не можете включить коммит или команду отката внутри функции в postgresql, вы можете сделать это в процедуре с версии 11.

То, что написано @a_horse_with_no_name, это то, что вы должны указать изоляциюуровень перед вызовом функции в транзакции

, например:

 begin SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ write;
 select  your_function_createNewOrder(...);
 commit;--rollback

С уважением

...