锁定和并发执行存储过程

时间:2011-11-24 17:12:24

标签: postgresql locking

我有一个由远程客户端持续执行的存储过程。通过阅读文档,我认为通过适当的锁定技术,我不需要从外部管理这些客户端,我可以自由地让它们像他们喜欢的那样经常和同时运行。

此过程更新并插入多个表。该程序的骨架轮廓如下:

LOCK TABLE table1 IN EXCLUSIVE MODE;

LOOP
    UPDATE table1 SET "var1"="var1"+1, WHERE "var2"=var2;
    IF found THEN
        EXIT;
    END IF; 

    BEGIN
        INSERT INTO table1 ("col") VALUES (1) RETURNING "ID" INTO id;
        EXIT;
    EXCEPTION WHEN unique_violation THEN
        EXIT;
    END;
    EXIT;
END LOOP;

LOCK TABLE table2 IN EXCLUSIVE MODE;

LOOP
    BEGIN
        INSERT INTO table2 ("var3","var4") values (var3,var4);
        EXIT;
    EXCEPTION WHEN unique_violation THEN
        EXIT;
    END;
END LOOP;

此后还有第三个表以与table1相同的方式锁定和更新/插入。事情正在按原样运行,但是Web应用程序也在同一个表上执行一些缓慢的select语句,并且独占锁会经常导致大的延迟。我认识到不应该有必要进行独占锁定,但无数的锁定类型以及适用于我程序中哪些表格有点令人困惑,所以我采用这种方法尽快实现。

我有几个问题:

此程序的最佳锁定策略是什么?我想正确地做到这一点,避免使用独占锁,我可以在这里启用Web应用程序来运行选择而不受干扰。

随着客户数量的增长,我将面临哪些限制?完全放弃这种方法并将所有客户的数据推送到中心位置并且只从那里运行程序会更好吗?

1 个答案:

答案 0 :(得分:4)

让数据库为您处理锁定。 PostgreSQL以及其他所有数据库都有锁定代码,可以根据需要锁定适当的行进行修改。 PostgreSQL使用名为Multi-Version Concurrency Control的东西,实际上意味着读者永远不会阻止或被作者阻止。

使用您当前的解决方案,随着客户端数量的增长,您将看到锁定增加,直到您的应用程序完全无法使用。再次,让数据库为您管理锁定 - 根据需要解析锁定非常有效。