`

select for update

 
阅读更多
xjr80C7HA3olbVr3y6H3t5--AcosrkB7YVl0ewJ1DtN5R9BE-aI3vCVHHdrfLVR_rshuFGAuxG
SELECT...FOR UPDATE 语句的语法如下:
  SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
  OF 子句用于指定即将更新的列,即锁定行上的特定列。
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
  “使用FOR UPDATE WAIT”子句的优点如下: 
-


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

说明:
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5   等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录




示例:
create table t(a varchar2(20),b varchar2(20));
insert into t values('1','1');
insert into t values('2','2');
insert into t values('3','3');
insert into t values('4','4');
现在执行如下操作:
在plsql develope中打开两个sql窗口,
在1窗口中运行sql
select * from t where a='1' for update;
结果:
A B
1       1
在2窗口中运行sql1
1. select * from t where a='1';
结果:
A B
1       1
这一点问题也没有,因为行级锁不会影响纯粹的select语句
再运行sql2
2. select * from t where a='1' for update;
结果:
waiting.......

则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。

如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3
3.
select * from t where a='1' for update nowait;
结果:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

则在执行此sql时,直接报资源忙的异常。
若执行
select * from t where a='1' for update wait 6;
则在等待6秒后,报 资源忙的异常。

如果我们执行sql4
4. select * from t where a='1' for update nowait skip Locked;
结果:
则执行sql时,即不等待,也不报资源忙异常。

现在我们看看执行如下操作将会发生什么呢?
在窗口1中执行:

select * from t where rownum<=3 nowait skip Locked; (此处好像有错误,应该为: select * from t where rownum<=3 for update nowait skip Locked;  )
A B

2 2
3 3


在窗口2中执行:
select * from t where rownum<=6 nowait skip Locked;
( 此处好像有错误,应该为:select * from t where rownum<=6 for update  nowait skip Locked;可以跳过被窗口1中语句:select * from t where a='1' for update; 锁住的行)

A B

2 2
3 3
4 4

select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的

表的行才会被锁定。


for update 必须同一个线程 sql提交才能commit成功,其他线程无效。
如果不指定nowait 和wait  ,则其他线程要更新本记录时,一直等待。
分享到:
评论

相关推荐

    mysql SELECT FOR UPDATE语句使用示例

    MySQL中的`SELECT FOR UPDATE`语句是在事务处理中用于实现数据锁定的一种机制,它主要用于解决多用户并发操作时的数据一致性问题。在InnoDB存储引擎下,MySQL默认的事务隔离级别是`REPEATABLE READ`,这允许事务在...

    Python Sqlalchemy如何实现select for update

    sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update ! 看...

    Mysql 数据库死锁过程分析(select for update)

    FOR UPDATE`相同数据导致的,而是由于`SELECT ... FOR UPDATE`与`UPDATE`语句之间的交互引发的。 一个例子是,当一个事务用`SELECT ... FOR UPDATE`锁定了一部分数据(例如ID从31到60的行),而另一个事务在同一...

    mysql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, ...在SELECT 的读取锁定主要分为两种方式:

    数据库oracle for update of和for update的区别

    SELECT * FROM Table1 WHERE pkid = 1 FOR UPDATE; ``` 2. **FOR UPDATE OF**: - `FOR UPDATE OF`允许开发者指定需要锁定的特定列,而不是锁定所有列。 - 这意味着只有指定的列会被锁定,其他未被指定的列可以...

    for_update_和_for_update_nowait_的区别

    当执行包含`FOR UPDATE`子句的`SELECT`语句时,Oracle会在所选择的行上放置排他锁(exclusive lock),即X锁,这种锁允许持有者读写数据,但阻止其他事务读写相同的行,直到原事务结束(通常是指提交或回滚)。...

    oracle执行update语句时卡住问题分析及解决办法

    但是奇怪的是执行其他的select语句却是可以执行的。 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit...

    根据update语句自动生成select语句

    在数据库管理中,UPDATE语句用于修改已存在的数据记录,而SELECT语句则用于查询数据。在某些场景下,我们可能需要从UPDATE语句转换为SELECT语句,以验证更新操作将影响哪些行或者理解更新逻辑。这在调试、数据分析或...

    oracle死锁表后处理

    级别2的锁有Select for update、Lock For Update、Lock Row Share select for update操作,当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级独占式锁定,其他对象只能查询这些数据行,不...

    oracle数据库的并发控制.docx

    在Oracle中,使用`SELECT FOR UPDATE`命令可以在预期要修改的记录上加行排它锁(X),并在表上加行共享锁(RS)。这种方法可以有效地解决读的不可重复性问题。 ##### 4. 锁之间的相互作用 锁之间存在着相互作用。...

    检测并解决冲突检测并解决冲突检测并解决冲突

    要解决这种冲突,我们可以使用 Oracle 的并发控制机制,例如使用 SELECT FOR UPDATE 语句来锁定记录,或者使用乐观锁机制来解决冲突。我们也可以使用 Oracle 的事务隔离级别来控制事务之间的交互。 在实际应用中,...

    oracle的update的五种方式

    例如:`BEGIN FOR cr IN (SELECT * FROM t_join_situation WHERE year='2011') LOOP UPDATE t_join_situation SET join_state='1' WHERE current of cr; END LOOP`。这种方式适用于大批量数据的更新,但需要注意游标...

    Oracle数据操作和控制语言详解

    `SELECT FOR UPDATE`是一个特殊语句,它允许在事务中锁定特定行,防止其他用户同时修改这些数据。 数据控制语言(DCL)则关注数据库的安全性和权限管理。`GRANT`和`REVOKE`是DCL的核心,分别用于赋予和撤销用户对...

    oracle lock

    - **TM锁**(表锁):在执行插入、更新、删除操作或`SELECT FOR UPDATE`时触发,目的是确保这些操作可以正常进行,同时阻止其他用户对表执行数据定义语言(DDL)操作。 - **TX锁**(事务锁/行锁):针对正在被修改的...

    pl_sql_developer使用技巧

    Query data会生成一个新窗口并执行`SELECT * FROM 表`,而Edit data则会执行`SELECT * FROM 表 FOR UPDATE`,这用于行级别的锁定,以便安全地编辑数据。 2. **Select for Update**: 在SQL Window中,你可以使用`...

    oracle锁机制探讨

    2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share 3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete and so on

    ORACLE资料

    如果在多表查询中使用 `SELECT FOR UPDATE`,可以通过指定 `OF table.column` 来锁定特定表的行,否则将锁定所有涉及表的相关行。 例如: ```sql SELECT t1.id, t2.info FROM test_table1 t1, test_table2 t2 WHERE...

Global site tag (gtag.js) - Google Analytics