在PostgreSQL中通过dblink兼容Oracle数据库中的自治事务

news2024/10/6 5:57:22

1、数据库事务原子性的局限与自治事务

1.1、事务原子性概述

如下所示,如果一个事务中有A和B两个数据的插入操作,当A的SQL语句执行成功后,因为某种原因(如服务器断电等),导致B的SQL语句执行失败,待数据库服务恢复正常后,数据库将进行回滚操作,此时即使A的SQL执行成功,也会连带一并撤销,回到事务执行之前的状态:

--创建一张表并提交事务
create table t(msg varchar(27));
commit;

--像该表中插入数据
insert into t values('string1');
insert into t values('string2');

--执行回滚操作,该回滚语句执行成功后,t表为空,无数据
rollback;

/*
上述SQL语句中,在数据库关闭自动提交的前提下,执行rollback语句后,两个insert操作都会
被撤销,而并不会只撤销“insert into t values('string2');”,因为两个insert操作在同一个事务中,
rollback是以事务为单位进行撤销,而非以SQL语句为单位,所以在这里,rollback执行成功后,
再查看该表时,表中为空,没有数据。

自动提交概念:现在部分数据库默认打开了自动提交的功能,具体表现为,执行一个SQL后,无需
手动输入“commit;”进行事务提交,因此在开启自动提交的绝大部分情况下,一个事务中就只包含
一个SQL语句
*/

上述SQL在Oracle Database 19c中的执行效果如下图:
在这里插入图片描述

1.2、Oracle数据库下自治事务使用场景

如1.1的SQL所示,若此时有个需求,是在关闭自动提交或不在每个SQL后手动commit的前提下,通过rollback语句,仅回滚最近执行的一个insert语句,而保留其他insert语句的执行结果,这个时候就需要用到自治事务。
自治事务并不是所有的数据库都支持,当下用得比较多的场景是在Oracle数据库下使用自治事务,针对本文1.1章节的SQL语句,我们可以改写为如下形式,使用Oracle的自治事务:

--创建一张表并提交事务
create table t ( msg varchar(27) );
commit

--创建一个存储过程Autonomous_Insert,将第二个insert和回滚语句写入这个存储过程中
create or replace procedure Autonomous_Insert
as
   pragma autonomous_transaction;  --使用Oracle自治事务语句
begin
    insert into t values ( 'string2' );  --将第二个insert语句写入
    rollback;   --将回滚语句写入
end;

--执行两个插入的操作
/
begin
    insert into t values ( 'string1' );
    Autonomous_Insert;  --调用包含第二个insert的存储过程
    commit;
end;
/

--查询表格,可看到此时表格中存在第1个insert的数据string1
select * from t;

上述SQL在Oracle Database 19c中的执行效果如下图:
在这里插入图片描述

2、通过dblink实现PostgreSQL下的自治事务

PostgreSQL原本并不像Oracle数据库那样支持自治事务,为了实现自治事务的功能,PostgreSQL需要额外安装扩展插件dblink,通过dblink的跨库查询功能间接实现自治事务。

2.1、PostgreSQL下的dblink扩展概述

PostgreSQL本身并不支持像MariaDB和SQL Server等数据库那样,直接在SQL上进行跨库查询,因此如下图所示的,在MariaDB的跨库查询的SQL语法在PostgreSQL是执行不成功的:
在这里插入图片描述
图中的语法在PostgreSQL中是不支持的。
为弥补PostgreSQL在跨库查询的局限性,PostgreSQL需要额外安装dblink扩展,通过dblink实现跨库查询可见2.2章节,跨库查询的语法和自治事务语法相同,只是dblink_connect函数中的,代表数据库名称的dbname参数不同而已,若是跨服务器的话,还涉及到代表IP地址的host参数的不同。

2.2、PostgreSQL下通过dblink实现自治事务

在本文1.1章节的两个insert语句的场景下,在PostgreSQL实现自治事务的SQL代码如下:

--创建数据库yanmuhuan_test
create database yanmuhuan_test;

--进入数据库yanmuhuan_test
\c yanmuhuan_test;

--安装dblink扩展
create extension dblink;

--关闭自动提交功能
\set AUTOCOMMIT off

--创建数据表t
create table t(msg varchar(27));
commit;

--创建一个存储过程Autonomous_Insert,将第1个insert写入这个存储过程中
create or replace function Autonomous_Insert(v_description varchar)
returns void
as 
$BODY$
declare
    v_sql text;
begin
    PERFORM dblink_connect('dbname=yanmuhuan_test user=postgres password=yanmuhuan1997114 host=127.0.0.1 port=5432');    --dblink_connect为跨库连接操作
    v_sql := format('INSERT INTO t VALUES(%L)',v_description);
    PERFORM dblink_exec(v_sql);   --dblink_exec中存放跨库执行的SQL(此处为第1个insert语句)
    PERFORM dblink_disconnect();   --dblink_disconnect为跨库连接断开操作
end;
$BODY$
LANGUAGE  plpgsql;
commit;

--执行两个插入的操作
select Autonomous_Insert('string1');
insert into t values('string2');
rollback;

--查询表格,可看到此时表格中只存在第1个insert的数据string1
select * from t;
commit;

上述SQL代码在PostgreSQL 13中执行情况如下图:
在这里插入图片描述
在这里插入图片描述

3、Oracle数据库与PostgreSQL自治事务思路和SQL逻辑的区别

Oracle数据库和PostgreSQL在自治事务的语法逻辑的实现上,是相反的,如下图所示:
在这里插入图片描述
造成这样的结果在于Oracle和PostgreSQL的特性不同,相关特性如下:

  1. Oracle数据库的会话在建立时,自动提交(隐式提交)默认关闭,因此Oracle数据库中,自治事务必须在存储过程内进行显式提交或回滚(即必须手动写入commit或rollback),所以若存储过程内没有手动写入commit或rollback进行显式提交,将会报“ORA-06519:检测到活动的独立的事务处理,
    已经回退”错误;

  2. PostgreSQL的会话在建立时,自动提交(隐式提交)默认打开,而PostgreSQL自治事务是由存储过程中的dblink实现的,相当于在一个SQL交互会话中再新建立一个临时会话,因此在存储过程中手动写入commit或rollback是没有意义且无效的,所以commit和rollback只能在关闭自动提交(隐式提交)的前提下于存储过程外进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务框架 SpringCloud微服务架构 微服务保护 32 隔离和降级 32.3 线程隔离【舱壁模式】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护32 隔离和降级32.3 线程隔离【舱壁模式】32.3.1 线程隔离【舱壁模式】32.3.2 案例32.3.3 总结32 隔…

【BBuf的CUDA笔记】一,解析OneFlow Element-Wise 算子实现

0x0. 前言 由于CUDA水平太菜,所以一直没写过这方面的笔记。现在日常的工作中已经不能离开写CUDA代码,所以准备学习ZZK随缘做一做CUDA的笔记记录一下学习到的知识和技巧。这篇文章记录的是阅读OneFlow的Element-Wise系列CUDA算子实现方案学习到的技巧&am…

MySQL主从复制与读写分离

目录 前言 一、MySQL主从复制的理解 1、MySQL的复制类型 2、MySQL主从复制的工作流程 3、MySQL架构(一主多备) 3.1 一主多备 3.2 M-S-S 3.3 M-M/双主互备 (互为主从) 3.4 M-M-M 4、MySQL主从复制延迟原因 5、MySQL主从…

FL Studio2023最新版编曲音乐制作数字音频软件

FL Studio2023即“Fruity Loops Studio”,也就是众所熟知的水果软件, 全能音乐制作环境或数字音频工作站(DAW)。FL Studio可以编曲、剪辑、录音、混音,让你的计算机成为全功能录音室。 FL Studio2023是一个完整的软件音…

学术分享 | 清华大学 康重庆:电力系统碳计量技术与应用(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥​ 📋📋📋本文目录如下:⛳️⛳️⛳️ 目录 ​ 0 写在最前面 1 学术分享 | …

MATLB|改进遗传算法优化微电网调度(考虑环境)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

Redis 高可用之持久化

Redis 高可用之持久化Redis 高可用什么是高可用Redis的高可用技术Redis持久化持久化的功能Redis提供两种方式进行持久化:RDB持久化触发条件bgsave执行流程启动时加载AOF持久化(支持秒级写入)开启AOF执行流程启动时加载RDB和AOF的优缺点RDB持久…

CSC7261M

CSC7261M是一款内置高压MOS的高性能、多工作模式的PWM控制芯片,内置多种保护机制。当系统为空载和轻载时,芯片采用Burst和Green控制模式可有效地减少了空载和轻载时的损耗。当系统为中载和重载时,CSC7261M芯片采用CCM模式可有效提升电源系统的…

校招面试中常见的算法题整理【长文】

⭐️我叫恒心,一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 文章目录前言一、链表问题1 合并…

Anaconda安装详细教程

一、Anaconda下载 (1)方式一:Anaconda官网 不推荐使用官网下载: (1)官网下载速度非常慢,需要使用国内源下载 (2)官网下载的是最新版本,可能使用时会出现意料…

基于java+springboot+mybatis+vue+mysql的地方废物回收机构管理系统

项目介绍 地方废物回收机构管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知地方废物回收机构管理系统的便捷高效,不仅为用户提供了服务,而且也推广了自己,让更多的用户了解自己。对于地方废物回收机构…

【 SQLite3移植到ARM Linux教程】

SQLite3移植到ARM Linux教程1 下载 SQLite3源码2 复制并解压源码包3 配置编译选项4 编译5 去除调试信息6 复制文件7 运行测试sqlite3SQLite 是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多…

MyBatis如何处理表关联

实体类 学生表 添加对应对象 - 教师 private Teacher teacher; 2. Mapper添加对应结果集映射 collection 一对多 学科表 对 学生表 1. 实体类 学科 添加对应集合 – 学生 private List<Student> stuList; 2. Mapper添加对应结果集映射 使用ResultType实现结果多表映…

[附源码]Python计算机毕业设计Django云南美食管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Redis配置、优化以及相命令

目录 一、关系数据库和非关系型数据库 1、关系型数据库 2、非关系型数据库 二、关系型数据库和非关系型数据库区别 1、数据存储方式不同 1.1 关系型数据 1.2 非关系型数据库 2、扩展方式不同 2.1 SQL数据库 2.2 NoSQL数据库 3、对事务性的支持不同 3.1 SQL数据库 …

全网最详细的HTTP协议学习笔记

目录 一、HTTP简介 相关词语 HTTP请求过程 二、HTTP详解 1.在TCP/IP协议中的位置 2.Request(请求消息) 3.Response(响应消息) 4.HTTP状态码 5.HTTP请求方法 6.其他 三、练习自测 四、总结 五、重点&#xff1a;配套学习资料和视频教学 一、HTTP简介 全称&#…

[附源码]Python计算机毕业设计大学生兼职管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

[附源码]Python计算机毕业设计宠物短期寄养平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

R语言无监督学习:PCA主成分分析可视化

总览 在监督学习中&#xff0c;我们通常可以访问n个 观测值的p个 特征 集 &#xff0c;并 在相同观测值上测得的 Y。 无监督学习是一组没有相关的变量 Y的方法。在这里&#xff0c;我们重点介绍两种技术… 主成分分析&#xff1a;用于数据可视化或在其他监督学习方法之…

面试官:你说说Springboot的启动过程吧(5.4万字分析启动过程)

文章目录前言一、Springboot是什么二、启动流程2.1 构建Spring Boot项目2.2 启动的日志2.3 启动流程分析说明2.3.1 第一部分&#xff1a;SpringApplication的构造函数A、webApplicationType&#xff08;web应用类型&#xff09;B、引导注册初始化器C、设置初始化器D、设置监听器…