0

我需要拍摄一些表格行的快照(SELECT)以进行显示。这些行将永远不会在同一个事务中被修改或删除,或传输到可以修改这些行的另一个事务。我只想要在 Postgresql 函数中进行简单的类似快照的读取。

例如:

SELECT * FROM "my_table" WHERE "amount" < 1000;

我正在考虑在我的 Postgresql 函数中设置 READ COMMITTED 事务级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

这是否可以确保我的 SELECT 永远不会遇到异常,无论其他繁重而复杂的事务是否同时运行?我相信是的,但我不是 Postgresql 专家。

更新:

在做了更多阅读之后,我想知道这是否也可以解决问题?

SET TRANSACTION ISOLATION LEVEL READ ONLY DEFERRABLE
4

1 回答 1

0

使用 Daniel 的信息,如果我执行以下操作来创建表并填充它:

CREATE TABLE IF NOT EXISTS "my_table" (amount integer);
TRUNCATE "my_table";

INSERT INTO "my_table" VALUES (100);
INSERT INTO "my_table" VALUES (200);
INSERT INTO "my_table" VALUES (1000);
INSERT INTO "my_table" VALUES (2000);

CREATE OR REPLACE FUNCTION my_function()
    RETURNS SETOF "my_table" AS $$
BEGIN
    RETURN QUERY SELECT * FROM "my_table" WHERE "amount" < 1000;
END; $$
LANGUAGE plpgsql;

我可以在客户端设置一个事务级别,以使用我想要的隔离来检索我想要的行(尽管对于简单的 SELECT 来说这可能是多余的):

SET TRANSACTION ISOLATION LEVEL READ ONLY DEFERRABLE;
SELECT * FROM my_function();
于 2014-03-28T19:36:45.457 回答