2013-10-15 3 views
0

У меня проблема с функцией postgresql, выполняемой из нескольких сеансов. Функция foo создается в несколько сеансов в одно и то же время. Это заставляет функцию входа в систему одновременно выполняться.Функция Postgresql, многократная сессия безопасности

Внутри функции входа (см. Ниже) есть оператор if IF token does not exists THEN, который также выполняется в одно и то же время. Конечно, он будет ложным для всей функции, так как токен еще не создан.

Это не то поведение, которое я хочу. Возможно ли, чтобы функция login была «потокобезопасной». Как синхронизировано в Java?

Псевдо функция:

CREATE OR REPLACE FUNCTION foo() RETURNS VARCHAR AS 
$body$ 
BEGIN 
    token = login(); 

    result = doStuffWithTheLogin(token); 

    IF result = LoginFailed THEN 
     token = login(true); 
     RETURN 'RETRY'; 
    END IF; 
END; 
$body$ 
LANGUAGE 'plpgsql' 
SECURITY DEFINER; 

Войти Функция:

CREATE OR REPLACE FUNCTION login(forceReload BOOLEAN) RETURNS VARCHAR AS 
$body$ 
BEGIN 
    IF NOT forceReload THEN 
     token = getTokenFromStorage(); 
    END IF; 

    IF token does not exists THEN 
     token = createNewToken(); 
     saveTokenToStorage(token); 
    END IF; 

    RETURN token; 
END; 
$body$ 
LANGUAGE 'plpgsql' 
SECURITY DEFINER; 

Я попытался с настольными замками. Но это действительно не помогло. Функция login занимает около 2-3 секунд для завершения, если есть 100 задач foo, таблица будет заблокирована в течение длительного времени.

+1

«* Функция foo ** создана ** в несколько сеансов в одно и то же время *» - почему вы * создаете * одну и ту же функцию снова и снова? –

ответ

0

Это не очень понятно, что проблема у вас возникли или пытаются решить, но это звучит, как вы ищете совещательного замок:

http://www.postgresql.org/docs/current/static/explicit-locking.html

и, возможно, обработки исключений:

http://www.postgresql.org/docs/current/static/plpgsql-errors-and-messages.html

+0

Консультационные замки, вероятно, лучший способ пойти сюда. –

+0

Консультационные замки работали так, как я хотел, спасибо! –

Смежные вопросы