我需要拍摄一些表行的快照(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
使用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();