更新时间:2023-10-17 GMT+08:00

规格约束

自治事务执行时,将会在后台启动自治事务session,我们可以通过max_concurrent_autonomous_transactions设置自治事务执行的最大并行数量,取值范围:0~1024

默认值:10。

当max_concurrent_autonomous_transactions参数设置为0时,自治事务将无法执行。

自治事务新启session后,将使用默认session参数,不共享主session下对象(包括session级别变量,本地临时变量,全局临时表的数据等)。

  • 触发器函数不支持自治事务。
    CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT);
    
    CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
    $$
    DECLARE
     PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
    RETURN NEW;
    END
    $$ LANGUAGE PLPGSQL;
  • 自治事务不支持非顶层匿名块调用(仅支持顶层自治事务,包括存储过程、函数、匿名块)。
    create table t1(a int ,b text);
    
    DECLARE 
     --PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
     DECLARE 
      PRAGMA AUTONOMOUS_TRANSACTION;
     BEGIN
      dbe_output.print_line('just use call.');
      insert into t1 values(1,'can you rollback!');
     END;
     insert into t1 values(2,'I will rollback!');
     rollback;
    END;
    /
    
    select * from t1;
  • 自治事务不支持ref_cursor参数传递。
    create table sections(section_ID int);
    insert into sections values(1);
    insert into sections values(1);
    insert into sections values(1);
    insert into sections values(1);
    
    CREATE OR REPLACE function proc_sys_ref()
    return SYS_REFCURSOR
    IS
    declare
      PRAGMA AUTONOMOUS_TRANSACTION;
            C1 SYS_REFCURSOR;
    BEGIN
     OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
     return C1;
    END;
    /
    
    CREATE OR REPLACE function proc_sys_ref(OUT C2 SYS_REFCURSOR, OUT a int)
    return SYS_REFCURSOR
    IS
    declare
      PRAGMA AUTONOMOUS_TRANSACTION;
            C1 SYS_REFCURSOR;
    BEGIN
     OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
     return C1;
    END;
    /
  • 分布式自治事务不支持下推(IMMUTABLE,STABLE类型)。
    CREATE OR REPLACE procedure autonomous_test_in_p_116(num1 int ) 
    IMMUTABLE 
    AS
    DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    perform pg_sleep(1);
    END;
    /
    
    CREATE OR REPLACE procedure autonomous_test_in_p_117(num1 int ) STABLE AS
    DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    perform pg_sleep(1);
    END;
    /
  • 分布式不支持检测(死锁时,有锁等待超时报错)。
    create table test_lock (id int,a date);
    insert into test_lock values (10,sysdate),(11,sysdate),(12,sysdate);
    CREATE OR REPLACE FUNCTION autonomous_test_lock(num1 int,num2 int) RETURNS
    integer LANGUAGE plpgsql AS $$
    DECLARE num3 int := 4;
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    update test_lock set a=sysdate where id =11;
    RETURN num1+num2+num3;
    END;
    $$;
    start transaction;
    update test_lock set a=sysdate where id =11;
    call autonomous_test_lock(1,1);
    END;
    
  • 自治事务函数不支持返回非out形式的record类型。
  • 不支持修改自治事务的隔离级别。
  • 不支持自治事务返回集合类型(setof)。