首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql函数,多会话安全

Postgresql函数,多会话安全
EN

Stack Overflow用户
提问于 2013-10-15 08:52:25
回答 1查看 261关注 0票数 0

我对postgresql函数有一个问题,它是从多个会话执行的。函数foo是同时在多个会话中创建的。这将导致同时执行登录函数。

在登录函数(见下文)中,有一个if语句IF token does not exists THEN,它也是在完全同时执行的。当然,它对所有函数都是假的,因为令牌还没有创建。

这不是我想要的行为。是否有可能使login函数成为“线程安全”。就像Java中的同步?

伪函数:

代码语言:javascript
复制
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;

登录功能:

代码语言:javascript
复制
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任务,表将被锁定很长时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-15 09:00:48

目前还不清楚你正在或试图解决什么问题,但听起来你似乎在寻找一个咨询锁:

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

也许还有异常处理:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19376963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档