在Postgresql中,用READ COMMITTED执行SELECT会触发异常吗?



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

相关内容

  • 没有找到相关文章

最新更新