一个微博上的搞笑,是剑网三黑人丐帮的微博,一开始在折被子,然后鬼来敲门,他用方言骂鬼,后来好像还和其他人收鬼

Oracle行级锁的特殊用法简析
字体:[ ] 类型:转载 时间:
Oracle有许多的锁,各种锁的效用是不一样的。下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定。可以更好的保证数据的安全性,需要的朋友可以了解下
Oracle有许多的锁,各种锁的效用是不一样的。下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定。可以更好的保证数据的安全性。 如果该用户正在修改某行,那么其他用户就可以更新同一表中该行之外的数据。 Oracle行级锁是一种排他锁,防止其他事务修改此行,但是不会阻止读取此行的操作。 在使用INSERT、UPDATE、DELETE 和SELECT…FOR UPDATE 等 语句时,Oracle会自动应用Oracle行级锁行级锁锁定。SELECT...FOR UPDATE 语句允许用户每次选择多行记录进行更新,这些记录会被锁定,且只能由发起查询的用户进行编辑。只有在回滚或提交事务之后,锁定才会释放,其他用户才可以编辑这些记录。 SELECT...FOR UPDATE 语句的语法如下:
代码如下: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中: OF 子句用于指定即将更新的列,即锁定行上的特定列。 WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。 “使用FOR UPDATE WAIT”子句的优点如下: ⒈防止无限期地等待被锁定的行; ⒉允许应用程序中对锁的等待时间进行更多的控制。 ⒊对于交互式应用程序非常有用,因为这些用户不能等待不确定 4. 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙'异常报告 示例:
代码如下: 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'
在2窗口中运行sql1
代码如下: 1. select * from t where a='1';
这一点问题也没有,因为行级锁不会影响纯粹的select语句 再运行sql2
代码如下: 2. select * from t where a='1'
则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。 如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3 3
代码如下: select * from t where a='1'
则在执行此sql时,直接报资源忙的异常。 若执行
代码如下: select * from t where a='1' for update wait 6;
则在等待6秒后,报 资源忙的异常。 如果我们执行sql4 4.
代码如下: select * from t where a='1' for update nowait skip L
则执行sql时,即不等待,也不报资源忙异常。 现在我们看看执行如下操作将会发生什么呢? 在窗口1中执行: select * from t where rownum 《3 nowait skip L 在窗口2中执行: select * from t where rownum《6 nowait skip L select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。 select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客访问: 1952899
博文数量: 552
博客积分: 10211
博客等级: 上将
技术积分: 4931
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
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的意义之所在。
阅读(4962) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Oracle 的for update行锁 - 仰望者 - ITeye技术网站
博客分类:
键字: oracle 的for update行锁
  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 引发的‘资源忙’异常报告
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'
在2窗口中运行sql1
1. select * from t where a='1'; 这一点问题也没有,因为行级锁不会影响纯粹的select语句
再运行sql2
2. select * from t where a='1' 则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3
3. select * from t where a='1' 则在执行此sql时,直接报资源忙的异常。
若执行 select * from t where a='1' for update wait 6; 则在等待6秒后,报 资源忙的异常。
如果我们执行sql4
4. select * from t where a='1' for update nowait skip L 则执行sql时,即不等待,也不报资源忙异常。
现在我们看看执行如下操作将会发生什么呢?
在窗口1中执行:
select * from t where rownum&=3 nowait skip L
在窗口2中执行:
select * from t where rownum&=6 nowait skip L
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。
luweifeng1983
浏览: 669454 次
来自: 深圳
有用的,重启一下嘛。
设置了也不管用,怎么破呢?
锋子还有时间写博客,还是很闲哈!
呵呵 。学习一下1、行级锁(tx锁,也叫事务锁)在操作DML(create,insert,update)语句时,oracle会自动加上行级锁,在select * from table for update 【of column】【nowait|wait 3】时,oracle也会自动加锁
&&& 建议(1)一般在for update 时加nowait,这样就不用等待其他事务执行了,一判断有事务,立马抛出错误。
&&& 建议(2)一般的of column都是在多表操作的时候,能锁定其中一个表的某些列,如果还是同一张表的话,并不能锁定某些列
2、表级锁(tm锁)
表级锁包含了行级锁,(1),(2)也是通过行级锁来达到表级锁的,他俩没有严格的分类,表级锁是oracle直接扫整个表来判断事务了,而不用去扫描表里的每一行去判断事务了,这个在一些时候是非常有用的
&& 表级锁分了很多类型(mode):
(1)行共享 (ROW SHARE) & 禁止排他锁定表
(2)行排他(ROW EXCLUSIVE) & 禁止使用排他锁和共享锁
(3)共享锁(SHARE)
(4)锁定表,仅允许其他用户查询表中的行
&&&& 禁止其他用户插入、更新和删除行
&&&& 多个用户可以同时在同一个表上应用此锁
(5)共享行排他(SHARE ROW EXCLUSIVE) & 比共享锁更多的限制,禁止使用共享锁及更高的锁
(6)排他(EXCLUSIVE) & 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
一般的语法:
lock&table&STUDENT&in&exclusive&(表级锁排他)
但是在java程序中怎样去调用这样的语句,暂时没弄出来,这些语句在dba的使用的比较多
项目实战:
一方面,当Oracle执行SELECT&FOR UPDATE、INSERT、UPDATE、DELETE等DML语句时,自动在所要操作的表上申请表级RS锁(SELECT&FOR UPDATE)或RX锁(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请TX锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过LOCK TABLE语句来指定获得某种类型的TM锁。下表是笔者总结了Oracle中各SQL语句产生TM锁的情况:&&表六:Oracle数据库TM锁小结&&我们可以看到,通常的DML操作(SELECT&FOR UPDATE、INSERT、UPDATE、DELETE),在表级获得的只是意向锁(RS或RX),其真正的封锁粒度还是在行级;另外,Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁,Oracle通过回滚段(Rollback segment)来保证用户不读"脏"数据。这些都提高了系统的并发程度。&&&&由于意向锁及数据行上锁标志位的引入,减小了Oracle维护行级锁的开销,这些技术的应用使Oracle能够高效地处理高度并发的事务请求。
阅读(...) 评论()

我要回帖

更多关于 黑人毅台妹微博 的文章

 

随机推荐