解读:
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`语句是在事务处理中用于实现数据锁定的一种机制,它主要用于解决多用户并发操作时的数据一致性问题。在InnoDB存储引擎下,MySQL默认的事务隔离级别是`REPEATABLE READ`,这允许事务在...
FOR UPDATE`相同数据导致的,而是由于`SELECT ... FOR UPDATE`与`UPDATE`语句之间的交互引发的。 一个例子是,当一个事务用`SELECT ... FOR UPDATE`锁定了一部分数据(例如ID从31到60的行),而另一个事务在同一...
sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update ! 看...
MySQL中的事务,默认是自动提交的,即autocommit = 1; 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, ...在SELECT 的读取锁定主要分为两种方式:
SELECT * FROM Table1 WHERE pkid = 1 FOR UPDATE; ``` 2. **FOR UPDATE OF**: - `FOR UPDATE OF`允许开发者指定需要锁定的特定列,而不是锁定所有列。 - 这意味着只有指定的列会被锁定,其他未被指定的列可以...
当执行包含`FOR UPDATE`子句的`SELECT`语句时,Oracle会在所选择的行上放置排他锁(exclusive lock),即X锁,这种锁允许持有者读写数据,但阻止其他事务读写相同的行,直到原事务结束(通常是指提交或回滚)。...
但是奇怪的是执行其他的select语句却是可以执行的。 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit...
在数据库管理中,UPDATE语句用于修改已存在的数据记录,而SELECT语句则用于查询数据。在某些场景下,我们可能需要从UPDATE语句转换为SELECT语句,以验证更新操作将影响哪些行或者理解更新逻辑。这在调试、数据分析或...
级别2的锁有Select for update、Lock For Update、Lock Row Share select for update操作,当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级独占式锁定,其他对象只能查询这些数据行,不...
SQL> select nls_charset_name(to_number('0354','xxxx')) from dual; ``` 其中`0354`是通过编辑器获取的十六进制值。 3. **查询Oracle Client端的字符集**: 在Windows系统中,可以通过查询注册表中相应...
在Oracle中,使用`SELECT FOR UPDATE`命令可以在预期要修改的记录上加行排它锁(X),并在表上加行共享锁(RS)。这种方法可以有效地解决读的不可重复性问题。 ##### 4. 锁之间的相互作用 锁之间存在着相互作用。...
要解决这种冲突,我们可以使用 Oracle 的并发控制机制,例如使用 SELECT FOR UPDATE 语句来锁定记录,或者使用乐观锁机制来解决冲突。我们也可以使用 Oracle 的事务隔离级别来控制事务之间的交互。 在实际应用中,...
例如:`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`。这种方式适用于大批量数据的更新,但需要注意游标...
`SELECT FOR UPDATE`是一个特殊语句,它允许在事务中锁定特定行,防止其他用户同时修改这些数据。 数据控制语言(DCL)则关注数据库的安全性和权限管理。`GRANT`和`REVOKE`是DCL的核心,分别用于赋予和撤销用户对...
- **TM锁**(表锁):在执行插入、更新、删除操作或`SELECT FOR UPDATE`时触发,目的是确保这些操作可以正常进行,同时阻止其他用户对表执行数据定义语言(DDL)操作。 - **TX锁**(事务锁/行锁):针对正在被修改的...
Query data会生成一个新窗口并执行`SELECT * FROM 表`,而Edit data则会执行`SELECT * FROM 表 FOR UPDATE`,这用于行级别的锁定,以便安全地编辑数据。 2. **Select for Update**: 在SQL Window中,你可以使用`...
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share 3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete and so on