我遇到了从多个会话执行的postgresql函数的问题。函数foo
在同一时间在多个会话中创建。这导致登录功能同时执行。
在登录功能(见下文)中,有一个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任务,表将被锁定很长时间。
答案 0 :(得分:0)
目前尚不清楚您遇到或试图解决的问题,但听起来您正在寻找咨询锁:
http://www.postgresql.org/docs/current/static/explicit-locking.html
也许是异常处理:
http://www.postgresql.org/docs/current/static/plpgsql-errors-and-messages.html