函數(shù)中的選擇或插入是否容易出現(xiàn)爭用條件?我編寫了一個函數(shù)來為一個簡單的博客引擎創(chuàng)建帖子: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';當多個用戶同時刪除標記和創(chuàng)建帖子時,這種情況是否容易發(fā)生?具體來說,事務(以及由此產(chǎn)生的函數(shù))是否阻止了這種競爭條件的發(fā)生?我正在使用PostgreSQL 9.2.3。
3 回答

小怪獸愛吃肉
TA貢獻1852條經(jīng)驗 獲得超1個贊
添加回答
舉報
0/150
提交
取消