为了账号安全,请及时绑定邮箱和手机立即绑定

函数中的选择或插入是否容易出现争用条件?

函数中的选择或插入是否容易出现争用条件?

慕少森 2019-06-28 14:48:53
函数中的选择或插入是否容易出现争用条件?我编写了一个函数来为一个简单的博客引擎创建帖子:CREATE FUNCTION CreatePost(VARCHAR, TEXT, VARCHAR[])RETURNS INTEGER AS $$     DECLARE         InsertedPostId INTEGER;         TagName VARCHAR;     BEGIN         INSERT INTO Posts (Title, Body)         VALUES ($1, $2)         RETURNING Id INTO InsertedPostId;         FOREACH TagName IN ARRAY $3 LOOP            DECLARE                 InsertedTagId INTEGER;             BEGIN                 -- I am concerned about this part.                 BEGIN                     INSERT INTO Tags (Name)                     VALUES (TagName)                     RETURNING Id INTO InsertedTagId;                 EXCEPTION WHEN UNIQUE_VIOLATION THEN                     SELECT INTO InsertedTagId Id                    FROM Tags                    WHERE Name = TagName                    FETCH FIRST ROW ONLY;                 END;                 INSERT INTO Taggings (PostId, TagId)                 VALUES (InsertedPostId, InsertedTagId);             END;         END LOOP;         RETURN InsertedPostId;     END;$$ LANGUAGE 'plpgsql';当多个用户同时删除标记和创建帖子时,这种情况是否容易发生?具体来说,事务(以及由此产生的函数)是否阻止了这种竞争条件的发生?我正在使用PostgreSQL 9.2.3。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我认为,当标记已经存在时,在您的事务找到之后,它可能会被另一个事务删除的可能性很小。使用SELECT进行更新应该可以解决这个问题。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 615 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信