zoukankan      html  css  js  c++  java
  • How to make PostgreSQL functions atomic?

    Question:

    How to make PostgreSQL functions atomic?

    Assume I have some PostgreSQL functions like the following:

    CREATE FUNCTION insertSth() RETURNS void AS $$
    BEGIN
        INSERT INTO ...;
    END;
    
    CREATE FUNCTION removeSthAfterSelect() RETURNS TABLE(...) AS $$
    BEGIN
         SELECT id INTO some_id ...;
         RETURN QUERY SELECT * FROM ...;
         DELETE FROM ... WHERE id = some_id;
    END;
    
    CREATE FUNCTION justDeleteSth() RETURNS void AS $$
    BEGIN
         DELETE FROM ...;
    END;
    
    CREATE FUNCTION justSelectSth() RETURNS TABLE(...) AS $$
    BEGIN
         RETURN SELECT * FROM ...;
    END;

    From my understanding PostgresSQL functions insertSthjustDeleteSth and justSelectSth are going to be executed atomically(?). So parallel executions of them won't mess anything up.

    But for removeSthAfterSelect if there is a parallel execution it could be that SELECT id INTO some_id .. finds something, then concurrently another transaction calls justDeleteSth and deletes the row with id = someId, so when the transaction continues it won't delete anything here: DELETE FROM ... WHERE id = some_id; meaning it messes things up.

    Is this the case? Is there a way to avoid this problem? E.g. by saying that removeSthAfterSelectshould be executed atomically?

  • 相关阅读:
    28.Implement strStr()【leetcod】
    35. Search Insert Position【leetcode】
    27. Remove Element【leetcode】
    20. Valid Parentheses【leetcode】
    14. Longest Common Prefix【leetcode】
    Java的String中的subString()方法
    charAt()的功能
    spring整合mybatis
    AOP
    代理模式
  • 原文地址:https://www.cnblogs.com/oxspirt/p/10691332.html
Copyright © 2011-2022 走看看