Oracle的select for update

多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,PL/SQL提供了进行这样处理的一种语法。
这种语法包括两部分——在游标声明部分的FOR UPDATE子句和在UPDATE或DELETE语句中的WHERE CURRENT OF 子句。
通常,SELECT操作将不会对正处理的行执行任何锁定设置,这使得连接到该数据库的其他会话可以改变正在选择的数据。
但是,结果集仍然是一致性的。当确定了活动集以后,在执行OPEN的时刻,ORACLE会截取下该表的一个快照。在此时刻以前所提交的任何更改操作都会在活动集中反映出来。在此时刻以后所进行的任何更改操作,即使已经提交了它们,都不会被反映出来,除非将该游标重新打开。但是使用FOR UPDATE子句,在OPEN返回以前的活动集的相应行上会加上互斥锁,这些锁会避免其他的会话对活动集中的行进行更改。直到整个事务被提交为止。

示例:
DECLARE
CURSOR C_CUR IS SELECT * FROM STUDENDS FOR UPDATE OF XM;
BEGIN
OPEN C_CUR;
WHILE C_CUR%FOUND LOOP

UPDATE STUDENDS SET XM='AA'||XM WHERE CURRENT OF C_CUR;

END LOOP;
CLOSE C_CUR;
COMMIT;
END;


需要注意的是:1、UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列。如果没有列出任何列,那么所有的列都可以更新。
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。
### 回答1: Oracle中的SELECT FOR UPDATE语句用于锁定查询结果集中的行,以便在事务中进行更新操作。当一个事务使用SELECT FOR UPDATE语句锁定了某些行时,其他事务将无法对这些行进行更新操作,直到锁定的事务释放了锁。这种机制可以确保数据的一致性和完整性。 ### 回答2: Oracleselect for update 是一种锁定行功能,它可以确保在一个事务中,当一个会话开始更新数据时,另一个会话无法修改这些数据。 使用 select for update 首先需要使用 select 语句,该语句从需要更新的表中选择需要锁定的行。然后使用 for update 子句将这些行锁定。例如,下面是一个使用 select for update 的 SQL 语句: SELECT * FROM myTable WHERE id = 1 FOR UPDATE; 这个语句将检索 myTable 表中 id 为 1 的行,并将其锁定,以便其他会话无法修改此行,直到当前会话完成。 请注意,使用 select for update 会对数据库性能产生负面影响。由于锁定行后其他会话无法访问这些数据,因此可能会出现锁定竞争的情况,导致其他会话阻塞等待。因此,应谨慎使用 select for update,只在必要时使用它。同时还需要在程序中考虑一些优化思路,例如使用更细粒度的锁定,减少锁定时间等手段,以降低锁定导致的性能问题。 总之,select for updateOracle 中的一个很有用的功能,它可以确保数据的一致性和完整性。但是,在使用它时,需要仔细考虑并合理利用,以提高其性能效果。 ### 回答3: 在Oracle数据库中,SELECT ... FOR UPDATE语句用于锁定查询结果集中的行,以防止其他事务修改它们。在使用SELECT ... FOR UPDATE语句时,要在语句中明确地指定哪些列需要被锁定。如果不指定任何列,则默认会锁定所有列。 使用SELECT ... FOR UPDATE语句可以保证多个事务在并发修改同一行数据时不会发生冲突。这种锁定行的方式称为行级锁定。 SELECT ... FOR UPDATE语句可以与基于行级锁定的事务并发使用,并且可以充分利用Oracle数据库并发控制机制,提高系统的性能。 例子: 假设有一个账户表,在多个线程中需要对账户进行加款操作,需要保证加款时不会有其他线程同时进行减款操作。 可以使用以下SQL语句来实现这个功能: ```sql SELECT * FROM account WHERE account_number = '123456' FOR UPDATE; ``` 该语句会锁定account_number为"123456"的行,以防止其他事务修改该行数据。当一行被锁定时,其他事务不能修改该行。如果其他事务尝试修改该行,则会被阻塞,直到锁定被释放。 在加款操作完成后,需要手动提交事务或者回滚事务,以释放锁定。如果事务没有被提交或回滚,则锁定会一直存在,直到事务结束。 ```sql UPDATE account SET balance = balance + 100 WHERE account_number = '123456'; ``` 需要注意的是,使用SELECT ... FOR UPDATE语句时要小心死锁的问题。如果多个事务在查询同一行数据时都使用了FOR UPDATE语句,可能会出现死锁情况,这是需要谨慎处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值