Oracle select for update 用法

SELECT FOR UPDATE 用法

1、SELECT…FOR UPDATE 语法
SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
  OF 子句用于指定即将更新的列,即锁定行上的特定列。
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限等待锁释放。

2、for update 作用
select for update 是为了在查询时,避免其他用户对该表进行插入、修改、删除等操作,用于保证表数据的一致性。
例如:
select * from zh_tb for update; 会等待行锁释放之后,返回查询结果。
select * from zh_tb for update nowait; 不等待行锁释放,提示锁冲突,不返回查询结果。
select * from zh_tb for update wait 5; 等待5秒,若行锁仍未释放,则提示锁冲突,不返回查询结果。
select * from zh_tb for update skip locked; 查询返回查询结果,忽略掉有行锁的记录。
注意:如果查询带条件那么只会锁定条件中的行数据,未带条件则会锁定表。

3、使用 FOR UPDATE WAIT 子句的优点
防止无限期地等待被锁定的行。
允许应用程序中对锁的等待时间进行更多的控制。
对于交互式应用程序非常有用,因为这些用户不能等待不确定。
若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告。

4、for update 用法
在Oracle中如果只是使用select的话,Oracle是不会给数据加锁的。当数据正在被另一个进程修改的时候,使用select得到的结果就不是最新的,这就需要使用for update,当oracle发现满足条件的记录正在被更新时,不会立即执行select语句,而是一直等待下去,直到更新结束才会执行select语句。

for update 用法举例:
会话1执行如下命令:
SQL> create table zh_tb(c1 varchar(20) ,c2 varchar(20));

Table created.

SQL> select * from zh_tb;

no rows selected

SQL> insert into zh_tb values ('ZZH','ZZH');

1 row created.

SQL> insert into zh_tb values ('AHERN','AHERN');

1 row created.

SQL> select * from zh_tb for update;

C1                   C2
-------------------- --------------------
ZZH                  ZZH
AHERN                AHERN

SQL> commit;

在会话2执行如下查询:
SQL> select * from zh_tb where c1='ZZH' for update;

C1                   C2
-------------------- --------------------
ZZH                  ZZH
此时会话2使用 for update 锁定了查询出来的记录:

再次在会话一执行如下语句查询所有记录:
SQL> select * from zh_tb for update;

发现无法查询出结果,并且会话一直处于等待状态,这是因为会话2里的语句锁住了C1='ZZH'的行,此时会话会一直处于等待状态。只有等会话2中提交了事务之后,会话1才能返回查询结果。
此时我们在会话2执行提交命令提交事务,会话1立即返回了查询结果如下:
SQL> commit;

Commit complete.

SQL> 
提交后发现会话1立即返回了查询结果如下:
SQL> select * from zh_tb for update;
... 

C1                   C2
-------------------- --------------------
ZZH                  ZZH
AHERN                AHERN

SQL> SQL> 

如果大家对 for uodate nowait、for update skip locked 和 for update wair n 用法感兴趣,可以采用如下语句在不同的会话中去执行验证它不同的锁定逻辑。
select * from zh_tb for update nowait;
select * from zh_tb for update wait 6;
select * from zh_tb where rownum<=3 for update skip locked;

5、使用场景
FOR UPDATE 适合可以等待其他事务释放锁定的场景,这样可以逐一处理数据行,确保数据的一致性。
FOR UPDATE NOWAIT 适合那些需要立即知道是否可以锁定所需行的场景,如果无法立即获得锁定,则可以迅速做出响应。
注意:选择使用FOR UPDATE还是FOR UPDATE NOWAIT取决于具体应用场景和对事务等待时间的容忍度。

FOR UPDATE NOWAIT 和 FOR UPDATE的区别:
两者的区别在于如果所选行已经被另一个事务锁定,FOR UPDATE NOWAIT 会立即引发一个 ORA-00054 错误,而不是一直等待其他事务释放锁。

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

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

相关文章

基于RFID的课堂签到系统设计

1.简介 基于RFID的课堂签到系统设计是一种利用无线射频识别&#xff08;RFID&#xff09;技术实现课堂自动签到的系统。这种系统通过RFID标签&#xff08;通常是学生携带的卡片或手环等&#xff09;与安装在教室内的RFID读写器之间的无线电信号进行数据交换&#xff0c;从而实现…

移动设备安全革命:应对威胁与解决方案

移动设备已成为我们日常工作和家庭生活中不可或缺的工具&#xff0c;然而&#xff0c;对于它们安全性的关注和投资仍然远远不够。本文深入分析了移动设备安全的发展轨迹、目前面临的威胁态势&#xff0c;以及业界对于这些安全漏洞响应迟缓的深层原因。文中还探讨了人们在心理层…

Java跨平台的原理是什么?JDK,JRE,JVM三者的作用和区别?xxx.java和xxx.class有什么区别?看这一篇就够了

目录 1. Java跨平台相关问题 1.1 什么是跨平台(平台无关性)&#xff1f; 1.2 跨平台(平台无关性)的好处&#xff1f; 1.3 编译原理基础&#xff08;Java程序编译过程&#xff09; 1.4Java跨平台的是实现原理&#xff1f; 1.4.1 JVM(Java虚拟机) 1.4.2 Class文件 1.4.3 …

485开关量采集模块16路I/O输入输出ModbusRTU协议—DAM-3950A

品牌&#xff1a;阿尔泰科技 型号&#xff1a;DAM-3950A 概述&#xff1a; DAM-3950A为16路隔离数字量输入&#xff0c;6路C型10路A型信号继电器输出模块&#xff0c;RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff…

Linux 文件安装的mysql 启动

1、找到my.cnf 2、确定文件类容&#xff1a; 并确保这些重要的配置&#xff1a;basedir 、datadir、socket 文件或目录都存在 3、找到mysqld 位置 4、启动mysqld mysqld --defaults-file/etc/my.cnf --usermysql

使用Spring的 Environment 和 ConfigurableEnvironment 来在springboot应用启动过程中对属性进行修改。

1.修改yml文件的问题 我在上一篇文章中介绍了使用《java启动springboot项目前根据环境变量动态改编yaml文件的变量值》但是在FC启动后发现存在问题 springboot初始化时需要初始化数据库&#xff0c;这时就会存在数据库连接在yml文件修改之前&#xff0c;这就会导致链接数据库…

feign 报错 Connection reset executing POST

feign 连接异常&#xff1a; feign.RetryableException: Connection reset executing POST替换 feign的 client &#xff1a; Feign在默认情况下使用的是JDK原生的 URLConnection 发送HTTP请求&#xff0c;没有连接池。 可以尝试替换成 httpclient 或者 okhttp。调整最大连接…

c++基础(类和对象中)(类的默认成员函数)

目录 一.构造函数&#xff08;类似初始化&#xff09; 1.概念 2.构造函数的特点 二.析构函数&#xff08;类似 销毁对象/空间&#xff09; 三.拷贝构造函数(类似复制粘贴的一种 初始化 ) 1.概念&#xff1a; 2.拷贝构造的特点&#xff1a; 四.赋值运算符重载&#xff08…

level 6 day2-3 网络基础2---TCP编程

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

Android 11 使用HAL层的ffmpeg库(1)

1.frameworks/av/media目录下面的修改 From edd6f1374c1f15783d9920ebda22ea915e503775 Mon Sep 17 00:00:00 2001 From: GW00219471 <zhumingxingnoboauto.com> Date: Wed, 17 Jan 2024 15:16:10 0800 Subject: [PATCH] ?UTF-8?q?[V35CUX-4542]:E7A7BBE6A48Dcux20E8…

华为OD机试(C卷,200分)- 二叉树计算

题目描述 给出一个二叉树如下图所示&#xff1a; 请由该二叉树生成一个新的二叉树&#xff0c;它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树&#xff1b;右子树表示该节点右侧叶子节点为根节点的一颗新树。…

VS+QT 打包可执行文件.exe

切换成release版本&#xff0c;同时更改项目属性中release配置下的各个属性&#xff0c;确保匹配 重新生成解决方案&#xff0c;将生成的.exe复制到一个空白文件夹中 执行&#xff1a; cd D:\QT\5.12.10\msvc2015_64\binwindeployqt C:\Users\DELL\Desktop\serials\MainWind…

食南之徒~马伯庸

◆ 第一章 >> 老赵&#xff0c;这你就不懂了。过大于功&#xff0c;要受罚挨打&#xff0c;不合算&#xff1b;功大于过&#xff0c;下回上司有什么脏活累活&#xff0c;第一时间会想到你&#xff0c;也是麻烦多多。只有功过相抵&#xff0c;上司既挑不出你的错&#xf…

MMU(内存管理单元)

概述 MMU 即内存管理单元&#xff0c;是用硬件电路逻辑实现的一个地址转换器件&#xff0c;它负责接受虚拟地址和地址关系转换表&#xff0c;以及输出物理地址 线性地址 由于保护模式的内存模型是分段模型&#xff0c;它并不适合于 MMU 的分页模型&#xff0c;所以我们要使用…

springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient

背景 在对已有项目进行改造的时候&#xff0c;集成SpringConfigStarter&#xff0c;编写完bootstrap.yml&#xff0c;在idea 启动项中编辑并新增VM options -Dspring.cloud.config.discovery.enabledtrue&#xff0c;该版本不加spring不会从configService获取信息&#xff0c;…

三、GPIO口

我们在刚接触C语言时&#xff0c;写的第一个程序必定是hello world&#xff0c;其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界&#xff0c;在单片机中也不例外&#xff0c;不过我们的传统就是点亮第一个LED灯&#xff0c;点亮电阻&#xff0c;电容的兄弟&#x…

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1&#xff1a;图片与文字环绕示例2&#xff1a;多列布局示例3&#xff1a;响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式&#xff0c;最初设计用…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j&#xff08;生成接口文档&#xff09; 使用swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

JMeter请求导出Excel

前言 今天记录一个使用JMeter模拟浏览器请求后端导出&#xff0c;并下载Excel到指定位置的过程 创建请求 同样先创建一个线程组&#xff0c;再创建一个请求&#xff0c;设置好请求路径&#xff0c;端口号等 查看结果树 右键--添加--监听器--查看结果树 这里可以查看&#…