更新时间:2025-08-19 GMT+08:00
分享

自治事务

自治事务指的是在存储过程中启动一个独立的事务,该事务与主事务相互独立,能够在主事务提交或回滚后继续其操作。通过启动新的数据库会话(SESSION)来执行存储过程,自治事务可能会增加系统资源的使用,包括内存、CPU和数据库连接等。

建议将自治事务主要用于记录业务日志,而不应将其作为业务流程的入口或核心环节。应尽量避免频繁使用自治事务,以减少对系统资源的消耗。

gaussdb=# create schema best_practices_for_procedure;
CREATE SCHEMA
gaussdb=# create table best_practices_for_procedure.log_table(log_time timestamptz, message text);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'log_time' as the distribution column by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# create table best_practices_for_procedure.work_table(company text, balance float);
NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'company' as the distribution column by default.
HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
gaussdb=# insert into best_practices_for_procedure.work_table values('huawei', 100000);
INSERT 0 1
--创建自治事务存储过程。
gaussdb=# create or replace procedure best_practices_for_procedure.proc_auto(log_time timestamptz, message text) as
PRAGMA AUTONOMOUS_TRANSACTION; 
begin
insert into best_practices_for_procedure.log_table values (log_time, message); --只记录日志信息。
end;
/
CREATE PROCEDURE
--在存储过程内调用自治事务。
gaussdb=# create or replace procedure best_practices_for_procedure.proc1(companys text, turnover float) as
message text;
begin
    update best_practices_for_procedure.work_table set balance = balance + turnover where company = companys;
    message := 'Company turnover ' || turnover;
    best_practices_for_procedure.proc_auto(current_timestamp, message);
end;
/
CREATE PROCEDURE
gaussdb=# call best_practices_for_procedure.proc1('huawei', 1000);
 proc1
-------

(1 row)

gaussdb=# select * from best_practices_for_procedure.log_table;
           log_time            |        message
-------------------------------+-----------------------
 2024-11-25 15:23:27.202458+08 | Company turnover 1000
(1 row)

gaussdb=# drop schema best_practices_for_procedure cascade;
NOTICE:  drop cascades to 4 other objects
DETAIL:  drop cascades to table best_practices_for_procedure.log_table
drop cascades to table best_practices_for_procedure.work_table
drop cascades to function best_practices_for_procedure.proc_auto(timestamp with time zone,text)
drop cascades to function best_practices_for_procedure.proc1(text,double precision)
DROP SCHEMA

相关文档