当前位置:网站首页>Oracle与Postgresql在PLSQL内事务回滚的重大差异
Oracle与Postgresql在PLSQL内事务回滚的重大差异
2022-08-04 03:30:00 【mingjie73】
相关
《Oracle/Mysql迁移到Postgresql事务回滚行为差异及改造方法》
《Oracle与Postgresql在PLSQL内事务回滚的重大差异》
这个差异点非常容易造成Oracle迁移到PG后业务逻辑出现重大差异。
1 总结
先放总结
- Oracle:在PLSQL内如果语句执行失败,进入异常处理程序后,PL程序正常退出。那么在执行失败语句前面的SQL
不会回滚
,执行结果都正常提交了。 - Postgresql:在PLPGSQL内如果语句执行失败,进入异常处理程序后,PL正常退出。
那么整个PL内的所有SQL自动回滚
,因为:- PG不支持PL内写SAVEPOINT (Oracle在每个语句前有隐式的savepoint)
- PL整体包装在一个大事务内。
Oracle11g
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#LNPLS598
2 测试用例Oracle11g
drop table employees;
create table employees(employee_id int, salary int, raise int, job_id varchar(16), last_name varchar(16), first_name varchar(16));
insert into employees values (1, 1000, 60, 'ST_CLERK', 'Geller', 'Rose');
insert into employees values (2, 2000, 100, 'ST_CLERK', 'Green', 'Rachel');
insert into employees values (3, 4000, 400, 'ST_AAAAA', 'Bing', 'Chanller');
insert into employees values (4, 6000, 630, 'AD_CLERK', 'Geller', 'Rose');
insert into employees values (5, 7000, 120, 'AD_DSFWR', 'Green', 'Rachel');
insert into employees values (6, 8000, 410, 'AD_AAAAA', 'Bing', 'Chanller');
DROP TABLE emp_name;
CREATE TABLE emp_name AS SELECT employee_id, last_name, salary FROM employees;
CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);
DECLARE
emp_id employees.employee_id%TYPE;
emp_lastname employees.last_name%TYPE;
emp_salary employees.salary%TYPE;
BEGIN
SELECT employee_id, last_name, salary
INTO emp_id, emp_lastname, emp_salary
FROM employees
WHERE employee_id = 1;
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (100, emp_lastname, emp_salary);
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (emp_id, emp_lastname, emp_salary);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Insert was rolled back');
END;
/
select * from emp_name;
结果
3 测试用例Postgresql14
drop table employees;
create table employees(employee_id int, salary int, raise int, job_id varchar(16), last_name varchar(16), first_name varchar(16));
insert into employees values (1, 1000, 60, 'ST_CLERK', 'Geller', 'Rose');
insert into employees values (2, 2000, 100, 'ST_CLERK', 'Green', 'Rachel');
insert into employees values (3, 4000, 400, 'ST_AAAAA', 'Bing', 'Chanller');
insert into employees values (4, 6000, 630, 'AD_CLERK', 'Geller', 'Rose');
insert into employees values (5, 7000, 120, 'AD_DSFWR', 'Green', 'Rachel');
insert into employees values (6, 8000, 410, 'AD_AAAAA', 'Bing', 'Chanller');
DROP TABLE emp_name;
CREATE TABLE emp_name AS SELECT employee_id, last_name, salary FROM employees;
CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);
select * from emp_name;
DO $$DECLARE
emp_id employees.employee_id%TYPE;
emp_lastname employees.last_name%TYPE;
emp_salary employees.salary%TYPE;
BEGIN
SELECT employee_id, last_name, salary
INTO emp_id, emp_lastname, emp_salary
FROM employees
WHERE employee_id = 1;
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (100, emp_lastname, emp_salary);
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (emp_id, emp_lastname, emp_salary);
EXCEPTION
WHEN others THEN
raise notice 'Insert was rolled back';
END$$;
select * from emp_name;
执行结果
边栏推荐
- 【Ryerson情感说话/歌唱视听数据集(RAVDESS) 】
- 如何在MySQL中的数据库下删除所有的表
- uni-app 从零开始-基础模版(一)
- 目标检测-中篇
- 2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
- MCU C language -> usage, and meaning
- new Date converts strings into date formats Compatible with IE, how ie8 converts strings into date formats through new Date, how to replace strings in js, and explain the replace() method in detail
- Polygon zkEVM network node
- C语言--环形缓存区
- 一文看懂推荐系统:召回04:离散特征处理,one-hot编码和embedding特征嵌入
猜你喜欢
随机推荐
外卖店优先级
基于Qt的目录统计QDirStat
如何在MySQL中的数据库下删除所有的表
单片机C语言->的用法,和意思
The keytool command
【项目实现】Boost搜索引擎
Development of Taurus. MVC WebAPI introductory tutorial 1: download environment configuration and operation framework (including series directory).
2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
MRS: Introduction to the use of Alluxio
db2中kettle报错 Field [XXX] is required and couldn‘t be found 解决方法
2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机
keytool命令
内网服务器访问远程服务器的端口映射
数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比
Shell 函数
移动端响应式适配的方法
FFmpeg —— 通过修改yuv,将视频转为黑白并输出(附源码)
验证码业务逻辑漏洞
if,case,for,while
仿牛客论坛项目梳理