Menu

文档

用户自定义函数支持自治事务

自治事务可以在函数中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,执行的函数块中使用包含start transaction和commit/rollback的sql,其余语法与CREATE FUNCTION创建函数语法类似,一个简单的用例如下:

--创建表。
CREATE TABLE test1 (a int, b text);
--创建包含自治事务的函数。
CREATE OR REPLACE FUNCTION autonomous_easy_2(i int) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    START TRANSACTION;
    INSERT INTO test1 VALUES (2, 'a');
    IF i % 2 = 0 THEN
        COMMIT;
    ELSE
        ROLLBACK;
    END IF;
  RETURN i % 2 = 0;
END;
$$;
--执行命令。
select autonomous_easy_2(1);
--执行结果。
 autonomous_easy_2
-------------------
                 0
(1 row)
--执行命令,查询表数据。
select * from test1;
--执行结果。
 a | b
---+---
(0 rows)
--执行命令。
select autonomous_easy_2(2);
--执行结果。
 autonomous_easy_2
-------------------
                 1
(1 row)
--执行命令,查询表数据。
select * from test1;
--执行结果
 a | b
---+---
 2 | a
(1 row)
--清空表数据。
truncate table test1;
--在回滚的事务块中执行包含自治事务的函数。
begin;
insert into test1 values(1,'b');
select autonomous_easy_2(2);
rollback;
--检查表数据。
select * from test1;
--执行结果如下。
 a | b
---+---
 2 | a
(1 row)

上述例子,最后在回滚的事务块中执行包含自治事务的函数,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。

本文档遵循知识共享许可协议CC 4.0 (http://creativecommons.org/Licenses/by/4.0/)。