oracle行锁 select for update

本文介绍了SQL中的select for update语句的使用方法及其背后的锁机制原理。通过实例展示了如何使用该语句来避免并发修改问题,并解释了不同锁类型的作用及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果两个人同时查询到了一条数据,第二个的修改就会造成第一个人获取失效。为了避免这种情况的发生,我们使用了select for update对获取到的行进行了加锁。下面简单介绍一下select for update的使用方法。

先说明一下会用到的名词概念:
statement: 一个SQL语句。 

session: 一个由ORACLE用户产生的连接,一个用户能产生多个SESSION ,但相互之间是独立的。 

transaction:所有的改动都能划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。 

consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。 

用法介绍:
update, insert ,delete, select ... for update会LOCK相应的ROW 。 
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。 

LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会师释放。

简单举例:
transaction A下面
select from  connector where a.MOBILE='13937134399' for updata

如上,这个将会对查询出来的行加上一个行锁,如果在
transaction B下面对这一行数据进行增删改都将会等待,普通的查询可以,使用 select for update 查询也需要等待。
需要在transaction A下面执行需要的操作之后commit或者rollback之后,在其他transaction 下面才可以对此表此行进行操作。

使用这个行锁的情况一般是对并发的情况要求比较高的时候,需要锁住某行进行一些更新语句之后进行释放,再让其他transaction 去操作。在这次外呼系统中很好的利用了这点解决了并发的问题。

for update 后面还可以跟着[OF cols] [NOWAIT]
of 的使用主要是针对多表关联的时候,如果不使用of,对两个表涉及到的行都将锁住,使用of可以指定锁定哪个表,
例如:select a.MOBILE,b.NAME from  connector a,student 
where a.STU_ID=b.ID and a.MOBILE='13937134399' for updata of a.MOBILE  
这样的话student表中对应的行是不加锁的,对connector一个表中行加锁
不使用两个表都加锁。
 
[NOWAIT]的使用是当锁冲突的时候提示的情况:
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified" ,如果不使用就会一直等待,直到锁释放之后执行。
在页面上调试的时候由于异常处理不好,把数据锁住了没有提交,也没有rollback,遇到这样的情况的时候可以通过以下方式解决:

-----查看被锁对象的序列号、sid
SELECT o.owner,o.object_name,o.object_type,s.sid,s.serial# 
FROM v$locked_object l,dba_objects o,v$session 
WHERE l.object_id=o.object_id 
AND l.session_id=s.sid 
ORDER BY o.object_id,xidusn DESC
/
------利用sid 和序列号删除
alter system kill session '243,10265';
243是sid 10265是序列号

所以在使用锁的时候一定要做好页面的异常控制,不然很容易出问题。

*******************************************************
数据库中锁类型的介绍:
有两种基本的锁类型,排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
其中DML锁(data locks,数据锁),用于保护数据的完整性
DML锁的目的在于保证并发情况下的数据完整性,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
### Oracle 机制及其实现原理 Oracle 数据库中的机制是为了保护单个数据级别的并发控制而设计的一种定方式。它能够有效防止多个事务在同一时间对同一数据冲突的操作,从而保障数据的一致性和完整性。 #### 1. **的作用** 的主要作用是在事务处理过程中,确保只有一个事务可以修改某一的数据,直到该事务提交或回滚为止。这有助于避免诸如脏读、不可重复读以及幻读等问题的发生[^1]。 #### 2. **的触发场景** 通常会在以下几种情况下被激活: - 当某个事务尝试对特定数据 `INSERT`、`UPDATE` 或 `DELETE` 操作时。 - 使用 `SELECT ... FOR UPDATE` 显式声明对该以便后续更新操作。 例如,下面是一个典型的例子展示了如何利用 SQL 实施显式的行级锁定: ```sql SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE; ``` 此命令不仅检索指定员工记录而且还对其应用排他性的直至当前事务结束[^3]。 #### 3. **的具体为** 一旦某一被一个事务加上了,则在此之后任何其他的试图更改相同或者甚至只是简单地再次尝试对其进独占性读取(`FOR UPDATE`) 的另一个事务都将被迫进入等待状态, 直至原始持有者释放其持有的(即完成 COMMIT 或 ROLLBACK)[^1]. 需要注意的是尽管存在这样的限制但对于只做查询而不涉及改变内容的情况则不会受到影响也就是说普通的 SELECT 查询是不会受到先前存在的TX类型的RL所阻碍除非特别指定了 NOWAIT 参数. 另外值得注意的一个特性在于虽然理论上讲每个单独受影响的元组都应该分别对应各自独立实例化的 TX 类型 RL ,但实际上出于性能考虑ORACLE 并不总是如此严格执而是可能会采取某些优化措施比如当发现有大量连续区域内的项目都被标记上了相同的模式下的此类标志位时就有可能将其合并成更高级别的对象范围覆盖形式——也就是所谓的"升级"(Lock Escalation),不过正如前面提到过的那样官方文档里明确指出标准版产品线里面并不会主动发起这种动作因为那可能导致严重的阻塞风险特别是容易引发死现象所以一般仅限于极特殊定制化版本才会启用该项功能. #### 4. **监控与诊断工具** 对于想要深入了解系统内部运状况的人来说有几个非常有用的视图可以帮助我们观察正在发生的各种类型定活动详情: - `V$LOCK`: 提供关于整个数据库实例范围内现存的所有种类的信息. - `V$LOCKED_OBJECT`: 列出了目前正遭受 DML 定影响的对象列表. - 结合以上两者再加上 `V$SESSION`, 我们就可以构建起完整的链条关系链路用来追踪具体哪个 session 导致了哪些 resource 被占用等情况发生.[^3] --- ### 示例代码展示 这里给出一段简单的测试脚本用于演示基本概念: ```plsql BEGIN -- 开始第一个事务并定目标 EXECUTE IMMEDIATE 'LOCK TABLE emp IN EXCLUSIVE MODE'; DBMS_OUTPUT.PUT_LINE('Transaction T1 has locked the EMP table.'); -- 延迟模拟长时间作业 DBMS_LOCK.SLEEP(5); EXCEPTION WHEN OTHERS THEN NULL; END; / -- 启动第二个连接试着重入同样的逻辑看看效果... ``` 请注意实际部署环境中应尽量减少不必要的长周期未决态以免造成资源浪费同时也增加了潜在竞争压力. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值