У меня проблема с функцией 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, таблица будет заблокирована в течение длительного времени.
«* Функция foo ** создана ** в несколько сеансов в одно и то же время *» - почему вы * создаете * одну и ту же функцию снова и снова? –