`
jayluns
  • 浏览: 145970 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Select…For Update

SQL 
阅读更多
解读:
  Update语句与锁

  
  Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句。
  该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。
   如图20.51所示,左上角的会话用Select…For Update语句锁定了Department表中DeptNo='01'的行,右上角的会话说明其他会话不可以继续更改该行上的数据。从OEM中的锁的信 息可以看出,Select…For Update语句所加的锁与update语句所加的锁相同:一个行级别的EXCLUSIVE锁(说明多个事务不能同时操作同一行)、一个表级别的ROW EXCLUSIVE锁。
  
  
  
  
  
  
  图20.51 Select…For Update语句锁定了符合where条件的行
  如图20.52所示,左上角的会话用Update语句锁定了Department表中DeptNo='01'的行,右上角的会话说明其他会话不可以用Select…For Update语句继续锁定该行。
  
  
  
  
  
  
  
  图20.52 Select…For Update语句被其他会话阻塞了
   如图20.53所示,左上角的会话用Update语句锁定了Department表中DeptNo='01'的行,右上角的会话说明其他会话不可以用 Select…For Update NOWAIT语句继续锁定该行,且会立即返回一个错误提示“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源”,而不需要等待加锁成功。
  
  
  
  
  
  
  图20.53 如果加锁不成功,则Select…For Update NOWAIT语句就会立即返回错误提示
   可以看出,如果仅仅用update语句来更改数据时,可能会因为加不上锁而没有响应地、莫名其妙地等待,但如果在此之前,先用Select…For Update NOWAIT语句将要更改的数据试探性地加锁,就可以通过立即返回的错误提示而明白其中的道理,或许这就是For Update和NOWAIT的意义之所在。

本文转自
http://hi.baidu.com/xu520zl/blog/item/959fb08838e30797a5c272de.html

 

分享到:
评论

相关推荐

    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