用户自定义函数支持自治事务
自治事务可以在函数中定义,标识符为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)
上述例子,最后在回滚的事务块中执行包含自治事务的函数,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。