- 浏览: 189925 次
- 性别:
- 来自: 上海
文章分类
最新评论
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 ,则其他线程要更新本记录时,一直等待。
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 ,则其他线程要更新本记录时,一直等待。
发表评论
-
oracle 查看执行计划的方式
2016-12-20 18:16 387一、通过PL/SQL Dev工具 1、直接File- ... -
pl/sql 乱码解决
2016-08-25 16:25 331select userenv('language') from ... -
使用MySQL Proxy解决MySQL主从同步延迟
2016-08-15 16:26 538使用MySQL Proxy解决MySQL主从同步延迟 ... -
分库分表
2016-07-03 12:30 537第1章 引言 随着互联网 ... -
数据库超时
2016-03-07 10:37 478 -
oracle merge into
2016-03-04 16:16 424/*Merge into 详细介绍 MERGE语句是Oracl ... -
oracle 分区表
2016-03-02 14:59 430(1) 表空间及分区表的 ... -
一些注意的sql写法
2016-01-20 14:07 763Dashboard > 流程空间 > home ... -
oracle 组合索引使用
2016-01-14 20:33 893在Oracle中可以创建组合索引,即同时包含两个或两个以上列的 ... -
oracle 索引
2016-01-14 20:24 652一、 ROWID的概念 存储了row在数据文件中的具体位置: ... -
oracle 查看sql执行计划
2016-01-14 14:06 392如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划 ... -
oracle sql调优 执行计划固化 排序等 SQL Plan Baseline
2015-11-14 16:13 14251.对查询进行优化,应 ... -
oracle 字段类型 收录
2015-11-02 19:52 773字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符 ... -
oracle trunc 函数
2015-08-25 17:57 570Oracle trunc()函数的用法 --Oracle t ... -
oracle 分析函数
2015-08-03 12:49 611oracle分析函数--SQL*PLUS环 ... -
跨数据库事务研究
2015-05-12 11:16 871两种方案: 1、分布式 ... -
Oracle的悲观锁和乐观锁
2015-04-22 13:27 456为了得到最大的性能, ... -
MySQL数据库MyISAM和InnoDB存储引擎的比较
2015-04-21 13:49 492MySQL有多种存储引擎,MyISAM和InnoDB是其中常用 ... -
nosql学习
2015-04-20 09:56 5601、NoSQL数据库概念 NoSQL ... -
sql distinctt group by 分析
2015-04-14 15:28 567在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅 ...
相关推荐
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