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

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

  1. --创建表。
  2. CREATE TABLE test1 (a int, b text);
  3. --创建包含自治事务的函数。
  4. CREATE OR REPLACE FUNCTION autonomous_easy_2(i int) RETURNS integer
  5. LANGUAGE plpgsql
  6. AS $$
  7. DECLARE
  8. PRAGMA AUTONOMOUS_TRANSACTION;
  9. BEGIN
  10. START TRANSACTION;
  11. INSERT INTO test1 VALUES (2, 'a');
  12. IF i % 2 = 0 THEN
  13. COMMIT;
  14. ELSE
  15. ROLLBACK;
  16. END IF;
  17. RETURN i % 2 = 0;
  18. END;
  19. $$;
  20. --执行命令。
  21. select autonomous_easy_2(1);
  22. --执行结果。
  23. autonomous_easy_2
  24. -------------------
  25. 0
  26. (1 row)
  27. --执行命令,查询表数据。
  28. select * from test1;
  29. --执行结果。
  30. a | b
  31. ---+---
  32. (0 rows)
  33. --执行命令。
  34. select autonomous_easy_2(2);
  35. --执行结果。
  36. autonomous_easy_2
  37. -------------------
  38. 1
  39. (1 row)
  40. --执行命令,查询表数据。
  41. select * from test1;
  42. --执行结果
  43. a | b
  44. ---+---
  45. 2 | a
  46. (1 row)
  47. --清空表数据。
  48. truncate table test1;
  49. --在回滚的事务块中执行包含自治事务的函数。
  50. begin;
  51. insert into test1 values(1,'b');
  52. select autonomous_easy_2(2);
  53. rollback;
  54. --检查表数据。
  55. select * from test1;
  56. --执行结果如下。
  57. a | b
  58. ---+---
  59. 2 | a
  60. (1 row)

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