KingbaseES默认如果在PLSQL-block 执行过程中的任何SQL 语句导致错误,都会导致该事务的所有语句都被回滚,而Oracle 则是语句级的回滚。KingbaseES 为了更好的与 Oracle兼容,新增参数ora_statement_level_rollback 。当 ora_statement_level_rollback 为 on时,表示启用了语句级的回滚。

1、Oracle 与 KingbaseES 的差异

Oracle :在遇到 exception 时,只有触发异常的操作被回滚。

SQL> create table t(id integer);

Table created.

SQL> begin
2 insert into t values(123);
3 insert into t values('a');
4 exception
5 when others then
6 commit;
7 end;
8 / PL/SQL procedure successfully completed. SQL> select * from t; ID
----------
123

KingbaseES : 未启用语句级回滚。

test=# create table t(id integer);
CREATE TABLE test=# begin
test-# insert into t values(123);
test-# insert into t values('a');
test-# exception
test-# when others then
test-# commit;
test-# end;
test-# /
ANONYMOUS BLOCK test=# select * from t;
id
----
(0 rows)

2、启用语句级回滚

设置语句级回滚后,其行为与oracle 一致。

test=# set ora_statement_level_rollback=on;
SET test=# begin
test-# insert into t values(123);
test-# insert into t values('a');
test-# exception
test-# when others then
test-# commit;
test-# end;
test-# /
ANONYMOUS BLOCK test=# select * from t;
id
-----
123
(1 row)

注意,PLSQL 的语句级回滚只发生在异常被正确捕获的场景下才有效,如果exception 没有被捕获或没有捕获exception,则还是整个事务回滚。如以下例子:

test=# set ora_statement_level_rollback=on;

test=# delete from t;
DELETE 1 test=# begin
test-# insert into t values(123);
test-# insert into t values('a');
test-# exception
test-# when no_data_found then
test-# commit;
test-# end;
test-# /
ERROR: invalid input syntax for type integer: "a"
LINE 1: insert into t values('a')
^
QUERY: insert into t values('a')
CONTEXT: PL/SQL function inline_code_block line 3 at SQL statement test=# select * from t;
id
----
(0 rows)

  

KingbaseES PLSQL 支持语句级回滚的更多相关文章

  1. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  2. 使用shell脚本完成自动化部署及秒级回滚

    一.部署机代码目录结构 使用www用户进行代码部署,所有部署机上需要创建www用户,并赋予根目录权限,同时配置公私钥认证建立信任关系. [www@ansible-node1 deploy]$ tree ...

  3. 【MySQL】使用mysqlbinlog回滚

    参考:http://wubx.net/?s=mysqlbinlog mysql官方的mysqlbinlog没有回滚的功能,淘宝大牛对官方代码进行了修改使之能够将binlog中的DML操作变成互逆的语句 ...

  4. Sql Server 事务/回滚

    ,'test1','test1') commit tran t1  ---提交事务 功能:实现begin tran 和commit tran之间的语句,任一如果出现错误,所有都不执 事务不是有错就回滚 ...

  5. 14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚

    14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚 InnoDB 自动检测事务死锁和回滚一个事务 InnoDB 尝试挑选小的事务来回滚,事务 ...

  6. 14.3.5.2 Deadlock Detection and Rollback 死锁检测和回滚:

    14.3.5.2 Deadlock Detection and Rollback 死锁检测和回滚: InnoDB 自动检查四艘,回滚一个事务或者事务来打破死锁. InnoDB 试图选择小的事务来回滚, ...

  7. [SQL]事务回滚详解及示例

    存储过程中的 SET XACT_ABORT ON 和事务 在存储过程中写SET XACT_ABORT ON 有什么用? SET XACT_ABORT ON是设置事务回滚的! 当为ON时,如果你存储中的 ...

  8. SET XACT_ABORT ON [SQL SERVER] 设置事务全部回滚

    SET XACT_ABORT ON 设置事务回滚的默认是OFF. 当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚为OFF时,只回滚错误的地方

  9. 当网络中断的时候,JTA全局事务管理,究竟会不会回滚???

    前言:有人问了我一个问题,就是说在网络中断的时候,JTA的全局事务管理,会不会回滚?当时说会回滚,但没给对方说清楚理由,也不太认同我的观点.现在总结一下. 今天一天都在看文档(也查了一些博客和网站), ...

  10. SQL的事务回滚操作带案例分析

    SET XACT_ABORT on  BEGIN TRAN  INSERT INTO [PDA_Action] VALUES ('採购入库1')  INSERT INTO [PDA_Action] V ...

随机推荐

  1. Table布局

    Table布局 <table>最常用的也是最正确的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>来布局. 实例 实现一个简单的布局,将表格的bo ...

  2. SpringBoot下Akka的简单使用

    SpringBoot下Akka的简单使用 Akka框架实现一个异步消息传输,通过定义演员来处理业务逻辑. 首先引入依赖 <!-- akka --> <dependency> & ...

  3. win32 - 在cmd中禁用进程权限

    C:\Users\path>whoami /priv 在cmd中输入whoami /priv后将获得当前令牌(标准用户)的权限. C:\Users\path>tasklist /v /fo ...

  4. Golang gRPC学习(05): retry重试

    什么是重试 如果服务出现了错误,主要是网络,服务器出现了短暂异常的时候,该怎么办? 我们都会人工或者自动的重新连接服务试试,看服务是否恢复可用了. 这种重新进行连接服务的一种方式就是重试.如果是在微服 ...

  5. Redis搭建Sentinel实验环境

    环境准备 在物理机上启动3台虚拟机,IP地址分别为:192.168.56.4,192.168.56.5,192.168.56.6. 1.确保3台虚拟机的网络是相互联通的. 2.确保已经在3台虚拟机上安 ...

  6. 【复盘#01】myh笔试

    存疑 1.http响应体中版本和缓存是哪个字段(Etga) http和https的区别 2.mysql同一个表中有多个相同字段但搜索的时候只搜得出某一个,要怎么修改(inner ..) mysql如何 ...

  7. python中json.dumps() 与json.dump(),json.load()与json.loads()区别?

    json.dumps() 将 Python 对象转换为 JSON 字符串,并返回该字符串.而 json.dump() 将 Python 对象转换为 JSON 字符串,并将该字符串写入文件. json. ...

  8. CPNtools协议建模安全分析---实例(二)

    首先,token值是变迁的内部的,当变迁点火触发的时候token才会在网络中移动.在颜色Petri网中token是有区分的. 1.我么现在举一个学生吃饼的例子 ,颜色这样定义.    s表示一个学生类 ...

  9. 十步带你用IDEA创建一个WEB项目及部署(Tomcat)

    部署一个web项目首先需要安装Tomcat,还没安装的朋友们可以看一下我这个博客: https://www.cnblogs.com/deyo/p/17241878.html 第一步:打开Idea-新建 ...

  10. 使用PdfSharp从模板生成Pdf文件

    ​ 最近在做一个生成文档的需求.通过先制作一个包含各字段占位符的文档模板,导入这个模板并填写内容替换掉占位符,再输出成最终文件. 由于版式固定,安全性更好,业务上常用Pdf作为最终标准化的格式, 在. ...