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

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

我编写了一个函数来为一个简单的博客引擎创建帖子:

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。


慕少森
浏览 616回答 3
3回答

小怪兽爱吃肉

我认为,当标记已经存在时,在您的事务找到之后,它可能会被另一个事务删除的可能性很小。使用SELECT进行更新应该可以解决这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL