GreenPlum 实现伪自治事务

自治事务

  • 主事务的提交和回滚与⼦事务的提交和回滚互不影响;
  • gp中不存在⾃治事务,并且⼀个函数就是⼀个事务,通过gp的扩展组件dblink实现伪⾃治事务。

创建dblink扩展组件

  • 需要超级用户才能执行
create extension dblink;

创建序列

  • 序列用来区分不同的连接
drop sequence seq_dblink_sessionid;
create sequence seq_dblink_sessionid
	increment by 1
	minvalue 1
	maxvalue 9999
	start 1
	cycle;

创建存储过程 sp_dblink_exec

create or replace function sp_dblink_exec(vsql varchar,retrytimes int default 60)
 returns text
 language plpgsql
 security definer
as $function$
/*
 * 作者:v-yuzhenc
 * 功能:执行动态sql,并且该执行过程是自治的
 * 		相当于另外开了一个sql串窗口执行
 * vsql:执行的动态sql
 * retrytimes:拿不到连接时拿连接重试次数
 * */
declare 
	v_sql varchar := vsql;  --动态sql
	p_retrytimes int := retrytimes;
	p_count int := 0;
	p_session_id varchar := nextval('seq_dblink_sessionid')::varchar;
	p_session_name varchar := 'db_bddj_'||p_session_id;
	p_result text;
begin 
	--尝试拿连接
	while true loop
	begin
		--获取dblink连接
		perform dblink_connect(p_session_name,'host=192.168.233.10 port=5432 dbname=etl user=db_ods password=db_odsAa123456');
		exit;
		exception when others then 
			if p_count >= p_retrytimes then 
				exit;
			end if;
			p_count := p_count + 1;
			--睡眠1s再拿连接
			perform pg_sleep(1);
			continue;
	end;
	end loop;

	--执行动态sql语句
	p_result := dblink_exec(p_session_name,v_sql);
	--关闭dblink连接
	perform dblink_disconnect(p_session_name);
	return p_result;
	--报错时得先把连接关掉再把错误抛出来
	exception when others then 
		begin
			perform dblink_disconnect(p_session_name);
			exception when others then 
				null;
		end;
		raise exception '%',sqlerrm;
end;
$function$
;

测试

--创建测试表
create table tmp (
	id numeric
) distributed by (id);

--程序块插入数据制造异常
do $$
begin
	--普通插入
	insert into tmp values (1);
	--自治插入
	perform sp_dblink_exec('insert into tmp values (2);');
	raise exception '手工抛出异常!';
end$$;
  • 执行代码块的时候会报错
    在这里插入图片描述
  • 此时我们来看一下,数据有没有插入进去
select * from tmp;

在这里插入图片描述

  • 自治插入成功,普通插入失败
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sqlboy-yuzhenc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值