云服务器内容精选

  • 匿名块支持自治事务 自治事务可以在匿名块中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建匿名块语法相同,示例如下。 create table t1(a int ,b text); START TRANSACTION; DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN dbe_output.print_line('just use call.'); insert into t1 values(1,'you are so cute,will commit!'); END; / insert into t1 values(1,'you will rollback!'); rollback; select * from t1; 上述例子,最后在回滚的事务块前执行包含自治事务的匿名块,也能直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,示例如下。 --建表 create table t2(a int, b int); insert into t2 values(1,2); select * from t2; --创建包含自治事务的存储过程 CREATE OR REPLACE PROCEDURE autonomous_4(a int, b int) AS DECLARE num3 int := a; num4 int := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into t2 values(num3, num4); dbe_output.print_line('just use call.'); END; / --创建调用自治事务存储过程的普通存储过程 CREATE OR REPLACE PROCEDURE autonomous_5(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous_4(a,b); rollback; END; / --调用普通存储过程 select autonomous_5(11,22); --查看表结果 select * from t2 order by a; 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,示例如下。 --建表 create table t2(a int, b int); insert into t2 values(1,2); select * from t2; --创建包含自治事务的存储过程 CREATE OR REPLACE PROCEDURE autonomous_4(a int, b int) AS DECLARE num3 int := a; num4 int := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into t2 values(num3, num4); dbe_output.print_line('just use call.'); END; / --创建调用自治事务存储过程的普通存储过程 CREATE OR REPLACE PROCEDURE autonomous_5(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous_4(a,b); rollback; END; / --调用普通存储过程 select autonomous_5(11,22); --查看表结果 select * from t2 order by a; 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 规格约束 自治事务执行时,将会在后台启动自治事务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)。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,示例如下。 --建表 gaussdb=# create table t2(a int, b int); CREATE TABLE gaussdb=# insert into t2 values(1,2); INSERT 0 1 gaussdb=# select * from t2; a | b ---+--- 1 | 2 (1 row) --创建包含自治事务的存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_4(a int, b int) AS DECLARE num3 int := a; num4 int := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into t2 values(num3, num4); dbe_output.print_line('just use call.'); END; / CREATE PROCEDURE --创建调用自治事务存储过程的普通存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_5(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous_4(a,b); rollback; END; / CREATE PROCEDURE --调用普通存储过程 gaussdb=# select autonomous_5(11,22); just no use call. just use call. autonomous_5 -------------- (1 row) --查看表结果 gaussdb=# select * from t2 order by a; a | b ----+---- 1 | 2 11 | 22 (2 rows) 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,示例如下。 --建表 gaussdb=# create table t2(a int, b int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# insert into t2 values(1,2); INSERT 0 1 gaussdb=# select * from t2; a | b ---+--- 1 | 2 (1 row) --创建包含自治事务的存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_4(a int, b int) AS DECLARE num3 int := a; num4 int := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into t2 values(num3, num4); dbe_output.print_line('just use call.'); END; / CREATE PROCEDURE --创建调用自治事务存储过程的普通存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_5(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous_4(a,b); rollback; END; / CREATE PROCEDURE --调用普通存储过程 gaussdb=# select autonomous_5(11,22); just no use call. just use call. autonomous_5 -------------- (1 row) --查看表结果 gaussdb=# select * from t2 order by a; a | b ----+---- 1 | 2 11 | 22 (2 rows) 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,请参见CREATE PROCEDURE,示例如下。 --建表 gaussdb=# CREATE TABLE t2(a INT, b INT); CREATE TABLE gaussdb=# INSERT INTO t2 VALUES(1,2); INSERT 0 1 gaussdb=# SELECT * FROM t2; a | b ---+--- 1 | 2 (1 row) --创建包含自治事务的存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_4(a INT, b INT) AS DECLARE num3 INT := a; num4 INT := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO t2 VALUES(num3, num4); DBE_OUTPUT.PRINT_LINE('JUST USE CALL.'); END; / CREATE PROCEDURE --创建调用自治事务存储过程的普通存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_5(a INT, b INT) AS DECLARE BEGIN DBE_OUTPUT.PRINT_LINE('JUST NO USE CALL.'); INSERT INTO t2 VALUES(666, 666); autonomous_4(a,b); ROLLBACK; END; / CREATE PROCEDURE --调用普通存储过程 gaussdb=# SELECT autonomous_5(11,22); JUST NO USE CALL. JUST USE CALL. autonomous_5 -------------- (1 row) --查看表结果 gaussdb=# SELECT * FROM t2 ORDER BY a; a | b ----+---- 1 | 2 11 | 22 (2 rows) gaussdb=# DROP TABLE t2; DROP TABLE gaussdb=# DROP PROCEDURE autonomous_4; DROP PROCEDURE gaussdb=# DROP PROCEDURE autonomous_5; DROP PROCEDURE 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,请参见CREATE PROCEDURE,示例如下。 --建表 gaussdb=# CREATE TABLE t2(a INT, b INT); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# INSERT INTO t2 VALUES(1,2); INSERT 0 1 gaussdb=# SELECT * FROM t2; a | b ---+--- 1 | 2 (1 row) --创建包含自治事务的存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_4(a INT, b INT) AS DECLARE num3 INT := a; num4 INT := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO t2 VALUES(num3, num4); DBE_OUTPUT.PRINT_LINE('JUST USE CALL.'); END; / CREATE PROCEDURE --创建调用自治事务存储过程的普通存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_5(a INT, b INT) AS DECLARE BEGIN DBE_OUTPUT.PRINT_LINE('JUST NO USE CALL.'); INSERT INTO t2 VALUES(666, 666); autonomous_4(a,b); ROLLBACK; END; / CREATE PROCEDURE --调用普通存储过程 gaussdb=# SELECT autonomous_5(11,22); JUST NO USE CALL. JUST USE CALL. autonomous_5 -------------- (1 row) --查看表结果 gaussdb=# SELECT * FROM t2 ORDER BY a; a | b ----+---- 1 | 2 11 | 22 (2 rows) gaussdb=# DROP TABLE t2; DROP TABLE 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • 匿名块支持自治事务 自治事务可以在匿名块中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建匿名块语法相同,示例如下。 create table t1(a int ,b text);START TRANSACTION;DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGINdbe_output.print_line('just use call.');insert into t1 values(1,'you are so cute,will commit!');END;/insert into t1 values(1,'you will rollback!');rollback;select * from t1; 上述例子,最后在回滚的事务块前执行包含自治事务的匿名块,也能直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务