首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres选择...对于函数中的UPDATE

Postgres选择...对于函数中的UPDATE
EN

Stack Overflow用户
提问于 2013-09-19 02:23:55
回答 1查看 71.6K关注 0票数 47

对于Postgres函数中的更新行级锁定:

  • 我选择哪些列有关系吗?它们与我需要锁定然后更新的数据有什么关系吗?

SELECT * FROM table WHERE x=y进行更新;

vs

SELECT 1 FROM table WHERE x=y FOR UPDATE;

  • 如果不将数据保存在某个地方,我就无法在函数中执行select操作,所以我保存到一个虚拟变量中。这似乎有点老生常谈;这是做事情的正确方式吗?--

下面是我的函数:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION update_message(v_1 INTEGER, v_timestamp INTEGER, v_version INTEGER)
RETURNS void AS $$
DECLARE
    v_timestamp_conv TIMESTAMP;
    dummy INTEGER;
BEGIN
    SELECT timestamp 'epoch' + v_timestamp * interval '1 second' INTO v_timestamp_conv;
    SELECT 1 INTO dummy FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;
    UPDATE my_table SET (timestamp) = (v_timestamp_conv) WHERE userid=v_1 AND version < v_version;
END;
$$  LANGUAGE plpgsql;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 05:09:48

我选择哪些列有关系吗?

不,这不重要。即使使用SELECT 1 FROM table WHERE ... FOR UPDATE,查询也会锁定满足where条件的所有行。

如果查询从连接中检索行,并且我们不希望锁定连接中涉及的所有表中的行,而只锁定特定表中的行,则可以使用SELECT ... FOR UPDATE OF list-of-tablenames语法:

http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE

如果不将数据保存在某个地方,我就不能在函数中执行select操作,所以我保存到一个伪变量中。这似乎有点老生常谈;这是做事情的正确方式吗?

在Pl/PgSql中,使用PERFORM命令丢弃查询结果:

http://www.postgresql.org/docs/9.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-NORESULT

而不是:

代码语言:javascript
复制
SELECT 1 INTO dummy FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;

使用:

代码语言:javascript
复制
PERFORM 1 FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;
票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18879584

复制
相关文章

相似问题

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