Oracle for update [of column] | [nowait] 详解
2021/9/18 19:10:05
本文主要是介绍Oracle for update [of column] | [nowait] 详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 1 概述
- 2 语法
- 3 实例
-
- 3.1 for update of column
- 3.2 wait n | nowait
- 4 扩展:rowid
1 概述
- 单独的
select 语句
是不会添加任何锁的 - 可通过
for update 语句
锁住行数据 或 表数据
2 语法
select * from table_name for update [of column1, columnN][wait n|nowait];
语法解析:
1. 表级锁: 锁住表中所有的记录 select * from table_name for update; -- 锁住表中所有的记录 select * from table_name where column_name = 1 for update; -- 锁住表中列名为 1 的记录 2. 行级锁: 锁住某列的记录(单表时,加不加效果一样。多表时,锁定 of column 列对应的表) select * from table_name for update of column1; 3. wait n | nowait (1) wait 5: 当锁冲突时,等待 5s 后报错(资源正忙...) (2) nowait: 当锁冲突时,立即报错(资源正忙...)
3 实例
3.1 for update of column
总体结论:
连接的表个数 | 解释 |
---|---|
单表 | for update 和 for update of 是一样的 |
多表 | 只锁定 of column 对应的表(同一个表锁定一个列即可) |
其它:
- 不加 where 条件,是对全表进行锁定
- 加了 where 条件 ,是对行级别的锁定
单表时:for update 和 for update of column 没区别
结论:session 2 中 dml 语句 都要等待 session 1 commit 或 rollback
请注意:
1.scott.emp 和 scott.dept 是 Oracle 内置的表,用于测试使用的
2.scott.emp 是数据表,scott.dept 是类型表(外键)
场景1:for update
session 1:
SELECT * FROM scott.dept t WHERE t.deptno = 10 FOR UPDATE;
session 2:
UPDATE scott.dept t SET t.loc = 'test_lock' WHERE t.deptno = 10;
场景2:for update of column
session 1:
SELECT * FROM scott.dept t WHERE t.deptno = 10 FOR UPDATE OF t.loc, t.dname; -- 仅多了 OF t.loc, t.dname
session 2:
UPDATE scott.dept t SET t.loc = 'test_lock' WHERE t.deptno = 10;
多表时:只锁定 of column 对应的表(同一个表锁定一个列即可)
结论:session 2、3 中的 dml 语句中 非 of column 列对应的表,无需等待 session 1 commit 或 rollback
场景1:for update
session 1:
SELECT e.empno, e.ename, d.deptno, d.dname FROM scott.emp e, scott.dept d WHERE d.deptno = e.deptno AND d.deptno = 10 FOR UPDATE;
session 2:
UPDATE scott.emp e SET t.ename = 'test_ename' WHERE e.deptno = 10;
session 3:
UPDATE scott.dept d SET t.dname = 'test_dname' WHERE d.deptno = 10;
场景2:for update of column
session 1:
SELECT e.empno, e.ename, d.deptno, d.dname FROM scott.emp e, scott.dept d WHERE d.deptno = e.deptno AND d.deptno = 10 FOR UPDATE OF d.dname; -- 仅多了 OF d.dname
session 2:
UPDATE scott.emp e SET t.ename = 'test_ename' WHERE e.deptno = 10;
session 3:
UPDATE scott.dept d SET t.dname = 'test_dname' WHERE d.deptno = 10;
3.2 wait n | nowait
结论:
- wait 5: 当锁冲突时,等待 5s 后报错(资源正忙…)
- nowait: 当锁冲突时,立即报错(资源正忙…)
session 1:
SELECT * FROM scott.dept t WHERE t.deptno = 10 FOR UPDATE;
session 2:
SELECT * FROM scott.dept t WHERE t.deptno = 10 FOR UPDATE NOWAIT;
4 扩展:rowid
1. 通过 for update 的方式修改表记录会产生 锁 SELECT * FROM scott.dept t WHERE t.deptno = 10 FOR UPDATE; 2. 通过 rowid 的方式修改表记录是不会产生 锁 的 SELECT t.*, ROWID FROM scott.dept t WHERE t.deptno = 10;
这篇关于Oracle for update [of column] | [nowait] 详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11国产医疗级心电ECG采集处理模块
- 2025-01-10Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南