解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景

在OceanBase V4.1及之前的版本中,尽管已经为Oracle租户兼容了LOCK TABLE相关的语法,包括单表锁定操作,和WAIT N, NOWAIT 关键字。但使用时还存在一些限制。例如:LOCK TABLE只能针对单表进行锁定,并不支持多表或分区锁定;WAIT N和 NOWAIT 关键字在实际执行中并未发挥预期作用,即用户在语句中指定WAIT NNOWAIT后,实际的执行行为和关键字效果不一致,系统仍然会按照设定的语句超时时间和事务超时时间的最小值来等待锁,这意味着锁定操作可能会持续至语句超时或事务超时。

想要了解相关语法和描述可以参考官方文档。LOCK TABLE

在 Oceanbase 4.2 及之后的版本中,提供了更完备的 LOCK TABLE 语法兼容性,并补全了未生效的功能,包括对多表、多分区、多二级分区上锁,以及使WAIT NNOWAIT关键字生效。

LOCK TABLE 语法解析

LOCK TABLE 的语法如下所示:

LOCK TABLE
{
[ schema. ]  table
[ PARTITION '('partition ...')' | SUBPARTITION '(' subpartition ...')' ] 
...
}
IN lockmode MODE
[ NOWAIT | WAIT integer] ;

其对应的语法结构图如下。

lock_table::=对应的语法结构见下图:

1700449555

1700449563

partition_extension_clause::=对应的语法结构见下图:

1700449572

如果你对上述语法结构中的字段存疑,可以参考下表中对于LOCK TABLE 各字段的说明。

字段名称描述
table指定要锁定的表的名称。
partition指定要锁定的分区的名称。
subpartition指定要锁定的二级分区的名称。
lockmode指定锁定模式。OceanBase 数据库当前版本支持的锁定模式如下。ROW SHARE:允许并发访问锁定的表,但禁止用户锁定整个表而进行独占访问。ROW EXCLUSIVE :与 ROW SHARE 相同,但也禁止在 SHARE 模式下锁定表。在进行更新、插入或删除时,将自动获得 ROW EXCLUSIVE 锁。SHARE:允许并发查询,但禁止更新锁定的表。SHARE ROW EXCLUSIVE:用于查看整个表,并允许其他人查看表中的行,但禁止其他人在 SHARE 模式下锁定表或更新行。EXCLUSIVE:只允许对锁定的表进行查询,禁止对其进行其他操作。
NOWAIT如果对执行的表、分区或二级分区上锁时发生锁冲突,则指定 NOWAIT 可以让数据库立即将控制权返回给用户。在这种情况下,数据库会返回一条消息,以告知表、分区或子分区已被另一个用户锁定。
WAIT如果发生锁冲突,那么语句应该等待冲突的锁释放,直到超过用户设置的 interger 时间(单位对应为秒),integer 的值没有限制。

LOCK TABLE 语法实践

了解基本概念和原理后,我们来上手实践一下。以如下所示的表结构作为实践操作表,演示10个操作场景。其中,subpartition template 生成的二级分区名称为一级分区名称 + 's' + 二级分区模板名称,例如,p0分区有二级分区p0ssp0p0ssp1p0ssp2

create table test(col1 int, col2 int)
partition by range (col1)
subpartition by range (col2)
subpartition template
(
subpartition sp0 values less than (3),
subpartition sp1 values less than (6),
subpartition sp2 values less than (9)
)
(
partition p0 values less than (100),
partition p1 values less than (200),
partition p2 values less than (300)
);

场景1:对整个表上互斥锁。

lock table test in exclusive mode;

场景2:对一级分区p1上互斥锁。

lock table test partition (p1) in exclusive mode;

场景3:对二级分区p1ssp1上互斥锁。

lock table test subpartition (p1ssp1) in exclusive mode;

场景4:在两个客户端上分别对同一个表上锁,其中持锁客户端上互斥锁,请求锁客户端上共享锁。

# conn1
start transaction;
lock table test in exclusive mode;# conn2
start transaction;
set ob_trx_timeout = 10000000000; # 10000 second
set ob_query_timeout = 1000000;   # 1 second# client will get error code after 1 second
lock table test in share mode;
ERROR HY000: resource busy and acquire with NOWAIT specified or timeout expired

当 LOCK TABLE 语句不设置WAIT N/NOWAIT关键字时,其超时时间将取决于语句超时时间和事务超时时间的最小值,在该例子中即为 1 秒后将报出锁冲突错误。

场景5:在两个客户端上分别对同一个表上表锁,其中持锁客户端上互斥锁,请求锁客户端上共享锁,并使用NOWAIT关键字。

# conn1
start transaction;
lock table test in exclusive mode;# conn2
start transaction;
lock table test in share mode nowait;
ERROR HY000: resource busy and acquire with NOWAIT specified or timeout expired

当 LOCK TABLE 语句设置了NOWAIT关键字后,若遇到表锁冲突将会立即报错,并在报错信息中体现“NOWAIT”信息。该报错信息与语句不设置WAIT N/NOWAIT关键字不同。

场景6:在两个客户端上分别对同一个表上表锁,其中持锁客户端上互斥锁,请求锁客户端上共享锁,并使用WAIT N关键字。

# conn1
start transaction;
lock table test in exclusive mode;# conn2
start transaction;# client will get error code after 1 second
lock table test in share mode wait 1;
ERROR HY000: resource busy and acquire with NOWAIT specified or timeout expired

当 LOCK TABLE 语句设置了WAIT N关键字后,若遇到表锁冲突将会等待N秒,若N秒后为解锁将报错,并在报错信息中体现“timeout expired”信息。该报错信息与语句不设置WAIT N/NOWAIT关键字不同。

场景7:对一个表的多个分区上互斥锁。

lock table test partition (p1,p2) in exclusive mode;

场景8:对一个表的多个二级分区上互斥锁。

lock table test subpartition (p0ssp1,p1ssp2) in exclusive mode;

场景9:对一个表的多个分区和二级分区上互斥锁。

lock table test partition (p1, p2), test subpartition (p3ssp0, p3ssp1) in exclusive mode;

场景10:对不存在的分区上互斥锁(其中p3分区不存在,但是p0分区也不会上锁成功,整条语句将回滚).

lock table test partition (p0, p3) in exclusive mode;
ERROR HY000: Specified partition does not exist

写在最后

LOCK TABLE 语句是生产场景中常用的并发控制手段,可以帮助用户简单高效地实现表级的 ddl / dml 互斥。本文介绍了 OceanBase v4.2 新增的 LOCK TABLE Oracle 语法兼容的新特性,从语法的结构、字段的描述等角度详细解析了该新特性的使用方法,并分享了新特性的场景实践,希望能够帮助大家更“丝滑”地使用该特性,也欢迎大家在评论区分享优化建议、使用体验等。

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

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

相关文章

URL GET +号后台接收成空格

问题:参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 ,自动将号转成空格了。 尝试解决(失败&#…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令将立即被服务器执行,服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令,最后将执行命令所得的结果全部返回给客户端。 例…

STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

1.外部中断介绍 1.1 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。(事件与中断的区别,可参看STM32---中断与事件的区别_中断和事件的区别-CSDN博客) 具体有哪些&a…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果: 实现基本的功能: 根据游戏进程解释代码: 游戏初始化: 首先进入游戏,我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来: 然后…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文,例如下面的 字体选择对话框,但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面&#xff0c;html自动缩放页面&#xff0c;大屏自动缩放页面&#xff0c;数字看板自动缩放页面&#xff0c;大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

玄子Share-计算机网络参考模型

玄子Share-计算机网络参考模型 分层思想 利用七层参考模型&#xff0c;便于在网络通信过程中&#xff0c;快速的分析问题&#xff0c;定位问题并解决问题 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c;复杂问题简单化 更容易发现问题并针对性的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句&#xff0c;可以重复使用。它们包含在类或对象中&#xff0c;并通过调用来执行。 举个例子&#xff0c;println() 是一个方法&#xff…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

(四)相关性分析 学习简要笔记 #统计学 #CDA学习打卡

目录 一. 相关性分析简介 二. 相关性分析方法 1&#xff09;连续型变量vs连续型变量&#xff1a;Pearson/Spearman &#xff08;a&#xff09;Pearson &#xff08;b&#xff09;Spearman等级相关系数 2&#xff09;二分类变量&#xff08;自然&#xff09;vs连续型变量&…

macos知名的清理软件 cleanmymac和腾讯柠檬哪个好 cleanmymacx有必要买吗

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

【Golang】Gin教学-获取请求信息并返回

安装Gin初始化Gin处理所有HTTP请求获取请求的URL和Method获取请求参数根据Content-Type判断请求数据类型处理JSON数据处理表单数据处理文件返回JSON响应启动服务完整代码测试 Gin是一个用Go&#xff08;又称Golang&#xff09;编写的HTTP Web框架&#xff0c;它具有高性能和简洁…

Event loop(Message loop)

事件循环&#xff08;消息循环&#xff09; 浏览器的进程模型 进程 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 线程 …

【Linux学习】Linux权限(二)

文章目录 &#x1f680;Linux权限管理&#x1f680;修改文件的所有者&#x1f680;修改文件或目录的所属组&#x1f680;同时修改为念的拥有者与所属组&#x1f680;文件类型&#x1f680;file指令&#x1f680;目录权限&#x1f680;umask指令&#x1f680;粘滞位 &#x1f68…

网盘——私聊

在私聊这个功能实现中&#xff0c;具体步骤如下&#xff1a; 1、实现步骤&#xff1a; A、客户端A发送私聊信息请求&#xff08;发送的信息包括双方的用户名&#xff0c;聊天信息&#xff09; B、如果双方在线则直接转发给B&#xff0c;不在线则回复私聊失败&#xff0c;对方…

Sping源码(七)—ConfigurationClassPostProcessor创建流程

序言 前两篇文章介绍了invokeBeanFactoryPostProcessors的执行流程&#xff0c;和自定义实现BeanDefinitionRegistryPostProcessor类的方式方法。 这篇文章会主要介绍Spring启动加载xml时&#xff0c;ConfigurationClassPostProcessor类是如何加载到Spring中&#xff0c;并且…

【数学建模】最优旅游城市的选择问题:层次分析模型(含MATLAB代码)

层次分析法&#xff08;The analytic hierarachy process&#xff0c;简称AHP&#xff09;是一种常用的决策分析方法&#xff0c;其基本思路是将复杂问题分解为多个组成部分&#xff0c;然后对这些部分进行逐一评估和比较&#xff0c;最后得出最优解决方案。&#xff08;例如&a…

JVM知识点总结二

参考文章&#xff1a;【Java面试题汇总】JVM篇&#xff08;2023版&#xff09;_jvm面试题2023-CSDN博客 1、说说你了解的JVM内存模型&#xff1a; JVM由三部分组成&#xff1a;类加载子系统、运行时数据区、执行引擎 JVM内存模型&#xff1a; 内存模型里的运行时数据区&#…

ruby 配置代理 ip(核心逻辑)

在 Ruby 中配置代理 IP&#xff0c;可以通过设置 Net::HTTP 类的 Proxy 属性来实现。以下是一个示例&#xff1a; require net/http// 获取代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg proxy_address 代理IP:端口 uri URI(http://www.example.com)Net:…