Select … for update--手工加锁语句

本文详细介绍了Oracle中的SELECT ... FOR UPDATE语句,这是一种用于手动加锁数据行以防止并发冲突的方法。通过加锁范围子句(如`OF`子句)和加锁行为子句(如`NOWAIT`、`WAIT`和`SKIP LOCKED`)进行精细控制。默认情况下,`FOR UPDATE`会对所选数据行加锁,阻止其他会话的更新和删除操作,直到事务结束。文中通过实例展示了各种用法及其对锁的影响,并提醒开发者谨慎使用,以避免不必要的锁表故障。
摘要由CSDN通过智能技术生成
Select … for update语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍。

借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作。本篇我们就来介绍一下这个子句的用法和功能。

下面是采自Oracle官方文档《SQL Language Reference》中关于for update子句的说明:(请双击点开图片查看)


从for update子句的语法状态图中,我们可以看出该子句分为两个部分:加锁范围子句和加锁行为子句。下面我们分别针对两个方面的进行介绍。

加锁范围子句

在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁。

//采用默认格式for update
SQL> select * from emp where rownum<2 for update;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 79021980-12-17 800.00 20


此时,我们观察v$lock和v$locked_object视图,可以看到锁信息。
//事务信息视图
SQL> select addr,xidusn,xidslot,xidsqn from v$transaction;

ADDR XIDUSN XIDSLOT XIDSQN
-------- ---------- ---------- ----------
377DB5D0 7 19 808
//锁对象信息
SQL> select xidusn,xidslot,xidsqn,object_id,session_id, oracle_username from v$locked_object;

XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME
---------- ---------- ---------- ---------- ---------- ------------------------------
7 19 808 73181 36 SCOTT
//
SQL> select owner,object_name from dba_objects where object_id=73181;

OWNER OBJECT_NAME
------------------------------ ------------------------------------------------------------
SCOTT EMP

//
SQL> select addr, sid, type, id1,id2,lm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值