
# 规格约束
![](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/public_sys-resources/caution_3.0-zh-cn.png)
- 自治事务执行时，将会在后台启动自治事务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）。
 
