精华内容
下载资源
问答
  • oracle for update wait 解析

    千次阅读 2019-12-20 15:51:10
    select for update 可以看成 select for update wait UN-LIMITED ——查询记录如果被锁,则等待释放。执行过程中"自己"也会上行级锁,直到事务提交 select for update wait X—— 对某个记录进行查询,如果有被锁...

    总结:

    select for update 可以看成 select for update wait UN-LIMITED

    ——查询记录如果被锁,则等待释放。执行过程中"自己"也会上行级锁,直到事务提交

    select for update wait X—— 对某个记录进行查询,如果有被锁,则等待X秒。同样执行过程会上锁。

    select for update nowait —— 对某个记录进行查询,如果有被锁,则直接报错。

    转载自:https://www.cnblogs.com/GreenLeaves/p/6576646.html

    CREATE TABLE "TEST6" 
    (    
       "ID" VARCHAR2(30), 
       "NAME" VARCHAR2(30), 
       "AGE" NUMBER(2,0), 
       "SEX" VARCHAR2(2), 
       "ENAME" VARCHAR2(30), 
       "ADDTIME" DATE
    )
    insert into TEST6 (id, name, age, sex, ename, addtime) values ('1', '张三', 18, null, 'zhangsan', to_date('14-03-2017 00:00:09', 'dd-mm-yyyy hh24:mi:ss'));
    insert into TEST6 (id, name, age, sex, ename, addtime) values ('2', '李四', null, '1', 'Lisi', to_date('01-03-2017 02:00:00', 'dd-mm-yyyy hh24:mi:ss'));
    insert into TEST6 (id, name, age, sex, ename, addtime) values ('3', '王五', 20, '0', 'wangwu', to_date('09-01-2017 08:55:00', 'dd-mm-yyyy hh24:mi:ss'));
    insert into TEST6 (id, name, age, sex, ename, addtime) values ('4', '赵六', 23, '0', 'zhaoliu', to_date('03-03-2016 04:00:00', 'dd-mm-yyyy hh24:mi:ss'));
    insert into TEST6 (id, name, age, sex, ename, addtime) values ('5', '冯七', 22, null, 'fengqi', to_date('08-03-2017 12:00:01', 'dd-mm-yyyy hh24:mi:ss'));
    CREATE TABLE "TEST8" 
    (    
       "ID" NUMBER, 
       "ORDERID" NUMBER, 
       "PRODUCTID" NUMBER, 
       "PRICE" NUMBER(10,2), 
       "QUANTITY" NUMBER
    ) 
    insert into TEST8 (id, orderid, productid, price, quantity) values (1, 1, 1, 6, 10);
    insert into TEST8 (id, orderid, productid, price, quantity) values (2, 1, 2, 4, 5);
    insert into TEST8 (id, orderid, productid, price, quantity) values (3, 1, 3, 10, 2);
    insert into TEST8 (id, orderid, productid, price, quantity) values (4, 2, 1, 3, 6);
    insert into TEST8 (id, orderid, productid, price, quantity) values (5, 2, 2, 4, 6);

    以上是基础数据

     

    在oracle中,如果只进行select语句的话,是不会进行加锁的,也就是oracle会返回当前时刻的结果集,即使这个时候可能有另外一个进程在修改当前结果集的数据,因为没有加锁,所以oracle还是会正常的返回当前时刻的结果集,不会有任何影响。

    他们三个共同点:

    当使用select for update 或者select for update wait或者.....,那么oralce会给符合where条件的数据行加上一个行级锁

    1、select for update

    但是如果你的select 语句加了for update,那么就不是上面这回事了,当oracle发现select的当前结果集中的一条或多条正在被修改(注意:当数据被修改时,此时的数据行是被加锁的),那么他就会等到当前当前结果集被修改完毕并且commit之后才进行select操作,并对结果集进行加锁。同样的,如果查询语句发出后,其他会话需要修改结果集中的一条(或几条数据)也许要等到查询结束(commit)之后,才可以执行修改操作。

    代码如下:

    新建SQL窗口1,(相当于新建一个session会话)

    select * from test8 for update

    for  update 对整个结果集进行了加锁,意味着在当前session进行commit之前,任何其他的session进行update、delete、insert操作都会进行等待

    新建SQL窗口2(相当于新建一个session会话)

    update test8 set price=6 where ID=1

    显示执行中,等待会话一的查询执行完成

     

    现在我们将会话一的事务提交(commit)

    会话二的update语句执行成功

     

    2、select for update nowait

    for  update和for update nowait都会对查询到的当前结果集进行加锁,所不同的是,当有另外的会话在修改当前结果集中的数据,select for nowait所进行的查询操作不会进行等待,当发现结果集中的一些数据被加锁,立刻返回 “ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源”。测试代码如下:

    新建一个SQL窗口1(相当于新建一个会话)

    update test8 set price=3 where ID=1

    更新test8表的一条数据,但是不进行commit操作

    然后新建SQL窗口2(相当于新建一个会话)select for update nowait操作

    select * from test8 for update nowait

    总结分析:

    因为会话一,并没有commit所以test8中的ID=1的行被加锁了,所以当会话二进行select for update nowait检索到ID=1的数据行被加锁了,就立刻返回 “ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源”的错误。

    接下来我们对会话一进行commit操作,

    在执行会话二的select查询,ok,可以查出来了,并且对当前数据集进行了加锁操作,其他会话想要进行修改操作,必须等到会话二commit之后

     

     

    3、select for update wait

    它也会对查询到的结果集进行加锁,select for update wait与select for update nowait不同的地方是,当有另外的会话对它的查询结果集中的某一行数据进行了加锁,那么它不会像nowait一样,立即返回"ORA-00054错误",而是它支持一个参数,设定等待的时间,当超过了设定的时间,那一行数据还处于加锁的状态,那么它也会返回“ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源”。测试代码如下:

    首先新建SQL窗口1(相当于新建一个会话)执行update 语句,但是不进行commit操作,那么当前数据行将被lock

    update test8 set price=3 where ID=1

    接着新建SQL窗口2(相当于新建一个会话),在执行select for update wait 6,如果当前查询检索的数据集中,有被加锁了的行数据,那么等待6秒,如果6秒后,其他会话,还没有执行commit释放被加了锁的数据行的话,那么返回“ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源”。

     

    select * from test8 for update wait 6

     

    执行语句6秒后,报错。

    最后对会话一(SQL窗口一)进行commit操作

    紧接着执行会话二(SQL窗口二)中的sql语句,此时被加锁的数据行被释放

    正常的检索除了数据行,当时当前数据集被加锁,其他会话想操作此数据集,必须等会话二中的事务commit之后,才可以进行修改

     

    4、OF子句

     

    在多表查询中如果需要对多表查询的结果集进行加锁,可以使用OF子句。

    如果存在OF子句,那么就对满足OF子句的单表进行加锁,如果不存在OF子句就对整个结果集进行加锁,代码如下:

    a、不使用OF子句

    select a.ID,a.Name,b.price from test6 a
    LEFT JOIN test8 b
    ON a.ID=b.ID where b.ID>3
    for update

    没有进行commit操作,此时对test6和test8中的ID>3的数据行都进行了加锁,测试代码如下:

    新建一个会话,执行以下语句:

    select * from test6 for update skip locked

    select * from test8 for update skip locked

    测试结果证明,在没有OF子句的情况下,对多表查询的结果集进行select foe update,oracle会对满足where 条件的所有数据行进行加锁

     

    b、使用OF子句

    使用OF子句,那么oracle就会对满足OF子句的表进行加锁,在多表查询中。代码如下:

    select a.ID,a.Name,b.price from test6 a
    LEFT JOIN test8 b
    ON a.ID=b.ID where b.ID>3
    for update of a.ID

    在不执行commit操作的情况,新建一个会话,执行一下语句:

    select * from test6 for update skip locked

    select * from test8 for update skip locked

    比对测试结果,发现在OF子句的作用下,oracle对同时满足where子句(设置要加锁的数据行)和OF子句(主要设置加锁的表)的数据行进行了加锁。

     

    展开全文
  • 了nowait的时候,马上就会进行反馈“ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源 ”,如果是wait x,那么执行的时候会等待x秒,当x秒过去,资源依旧未解锁,就会反馈跟nowait一样的...
    当执行update的时候,不加nowait/wait x的时候,当数据记录被锁住的时候,是一直处于等待状态,直到解锁。而加了nowait的时候,马上就会进行反馈“O
    RA-00054
    错误,内容是资源正忙
    
    但指定以
     NOWAIT 
    方式获取资源
     ”,如果是加的 wait x,那么执行的时候会等待x秒,当x秒过去,资源依旧未解锁,就会反馈跟nowait一样的信息。
    展开全文
  • java Process.waitFor阻塞

    千次阅读 2019-06-30 16:29:02
    关于java Process waitFor() 进程阻塞问题 ... 问题:有同学遇到java调用Process.exec(),node purppeteer插件去浏览器截图,出现...M,CSS值居高不下,初步定为waitFor阻塞造成缓存区无法分配。 JDK帮助文档上说:如...

    关于java Process waitFor() 进程阻塞问题

    摘录自:http://lelglin.iteye.com/blog/1487351

    问题:有同学遇到java调用Process.exec(),node purppeteer插件去浏览器截图,出现jdk进程未知错误,jstate

    M,CSS值居高不下,初步定为waitFor阻塞造成缓存区无法分配。

    JDK帮助文档上说:如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。对此JDK文档上还有如此解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。好了,

            问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。

            接着来分析缓冲区,哪来的这个东西,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入标准输出标准错误流

     

    假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。 知道问题所在,我们解决问题就好办了。查看网上说的方法多数是开两个线程在waitfor()命令之前读出窗口的标准输出缓冲区和标准错误流的内容。代码如下:

     

    复制代码

     1 Runtime rt = Runtime.getRuntime();   
     2  String command = "cmd /c ffmpeg -loglevel quiet -i "+srcpath+" -ab "+bitrate+"k -acodec libmp3lame "+desfile;   
     3  try {   
     4   p = rt.exec(command ,null,new File("C:\\ffmpeg-git-670229e-win32-static\\bin"));   
     5   //获取进程的标准输入流   
     6   final InputStream is1 = p.getInputStream();    
     7   //获取进城的错误流   
     8   final InputStream is2 = p.getErrorStream();   
     9   //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流   
    10   new Thread() {   
    11      public void run() {   
    12         BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));   
    13          try {   
    14              String line1 = null;   
    15              while ((line1 = br1.readLine()) != null) {   
    16                    if (line1 != null){}   
    17                }   
    18          } catch (IOException e) {   
    19               e.printStackTrace();   
    20          }   
    21          finally{   
    22               try {   
    23                 is1.close();   
    24               } catch (IOException e) {   
    25                  e.printStackTrace();   
    26              }   
    27            }   
    28          }   
    29       }.start();   
    30                                   
    31     new Thread() {    
    32        public void  run() {    
    33         BufferedReader br2 = new  BufferedReader(new  InputStreamReader(is2));    
    34            try {    
    35               String line2 = null ;    
    36               while ((line2 = br2.readLine()) !=  null ) {    
    37                    if (line2 != null){}   
    38               }    
    39             } catch (IOException e) {    
    40                   e.printStackTrace();   
    41             }    
    42            finally{   
    43               try {   
    44                   is2.close();   
    45               } catch (IOException e) {   
    46                   e.printStackTrace();   
    47               }   
    48             }   
    49          }    
    50        }.start();     
    51                                   
    52        p.waitFor();   
    53        p.destroy();    
    54       System.out.println("我想被打印...");   
    55      } catch (Exception e) {   
    56              try{   
    57                  p.getErrorStream().close();   
    58                  p.getInputStream().close();   
    59                  p.getOutputStream().close();   
    60                  }   
    61               catch(Exception ee){}   
    62            }   
    63     }

    复制代码

    展开全文
  • for循环内使用wait()方法注意

    千次阅读 2018-10-09 22:21:32
    格式的长字符,写了一段看起来很不成熟的代码,然后还把自己绕晕了= =、原来是因为在for循环里使用if-elseif结构调用wait方法导致出错,找了好久的bug终于反应过来了,为了下次不再犯类似的错误,在这里进行一下总结...

         今天用wait()和notify()进行线程通信实现输出12A34B56C.....格式的长字符,写了一段看起来很不成熟的代码,然后还把自己绕晕了= =、原来是因为在for循环里使用if-elseif结构调用wait方法导致出错,找了好久的bug终于反应过来了,为了下次不再犯类似的错误,在这里进行一下总结。

       下面就是我那不太成熟的代码:

    //打印字母的线程类
    public class PrintAlphabet implements Runnable {
          private MyPrint myprint;
    
    	@Override
    	public void run() {
              myprint.printAlphabet();
    	}
    	public PrintAlphabet(MyPrint myprint) {
    		super();
    		this.myprint = myprint;
    	}
    }
     
    
    //打印数字的线程类
    public class PrintCount implements Runnable{
    	 private MyPrint myprint;
    	@Override
    	public void run() {
    		myprint.printCount();
    	}
    	public PrintCount(MyPrint myprint) {
    		super();
    		this.myprint = myprint;
    	}
    }
    

     

    //打印字母的方法
    public synchronized  void printAlphabet(){
    			for(;number<78;number++){
    			   if(number%3==0){
    				   try {
    					wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			   }
    			   else  if(number%3==1){
    				   System.out.println("老大number:"+number+"----->"+countnumber+++"  ");
    			   }
    			   else  if(number%3==2) {
    				   System.out.println("老二number:"+number+"----->"+countnumber+++"  ");
    				    notifyAll();
    			   }
    			   }
    		   
    	}
    
    //打印数字的方法
    public synchronized  void printCount(){
    		for(;number<78;number++){
    			   if(number%3==1||number%3==2){
    				   try {
    					wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			   }
    			   else  if(number%3==0){
    			  System.out.println("老三number:"+number+"----->"+(char) alphabetnumber+++"   ");
    			   
    			   notifyAll();
    			   }
    		   }
    		}
    	

     

    运行结果如下:

    后面仔细检查发现自己蠢哭了,原来每次回到wait()的地方都没有进行重新判断number的值,而是直接结束了本次循环。所以具体过程应该是这样的:

          首先number等于1打印出老大,然后继续循环打印出老二,当运行到number等于3之后甲线程wait,在乙线程输出来老三,然后调用nitifyAll()唤醒线程甲,但是要先number加一等于4之后线程甲才回到之前wait的地方,但是因为我没有用while重新进行判断,所以执行完wait就直接结束本次循环number又加一等于5,直接跟着打印出了老二,这就解释了上面运行结果为什么缺了老大,继续number加一等于6,此时线程1就wait了。然后又回到第二个线程wait的地方开始运行,还是因为没有重新判断,所以这个时候又直接加一为7,所以线程2也wait了。

      解决办法:1.把for循环改成while循环          

                        2.把if-elseif-结构改成if-if-if结构

     总结: 其实看代码发现,其实我的wait()方法也是放在循环中的,只是因为我用的是for循环,又使用if-elseif结构进行判断,这就导致了每次重新回到了wait的地方都不能继续往下执行,而如果我用while循环就不会出现这种情况了。

     

     

     

    展开全文
  • 但是如果你的select 语句for update,那么就不是上面这回事了,当oracle发现select的当前结果集中的一条或多条正在被修改(注意:当数据被修改时,此时的数据行是被加锁的),那么他就会等到当前当前结果集被修改完毕...
  • String dos="sqlldr "+user+"/"+psw+"@"+Database+" ... 其中那个process.waitfor()方法每次都返回2,但是数据插入数据库成功。 插入失败时返回1。 请问返回值总是2是什么原因? ``` ```
  • C++11 wait_for函数理解

    千次阅读 2020-12-07 13:44:05
    //最后一个参数是预制条件,调用wait_for的时候,首先就会判断这个条件, //如果这个条件返回false,那么会继续等待,如果再超时之前,收到了一个notify //那么他会再次执行这个预制条件来进行判断,超时的时候也还...
  • waitfor 的用法

    千次阅读 2019-09-21 21:31:24
    waitfor 可以在指定的时间或者过了一定的时间段后执行语句块、存储过程或事务 语法格式 :waitfor time '' 时间不能有日期部分 waitfor time '10:04:54'print 'OK' 转载于:...
  • SQL中waitfor time语句

    千次阅读 2017-02-28 19:14:33
  • 文章目录结构体init_completioncompletewait_for_completion 结构体 struct completion { unsigned int done; wait_queue_head_t wait; }; #define UINT_MAX (~0U) init_completion #define init_completion(x) ...
  • SQL中waitfor delay语句

    千次阅读 2017-02-28 19:12:57
  • oracle for update和for update nowait的区别

    千次阅读 2018-08-04 13:28:44
    1、for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会任何
  • java.lang.Process.waitFor()方法将导致当前的线程等待,如果必要的话,直到由该Process对象表示的进程已经终止。此方法将立即返回,如果子进程已经终止。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。...
  • 完美解决runtime.exec()执行进程block死锁以及为waitFor设置超时 不需要耗cpu的循环判断exitValue==0 开两个进程搞定
  •   elasticsearch一般称为近实时的大数据处理引擎,为什么是近实时呢?原因是当我们提交索引数据时,实际上只是写到了Buffer里面,并不是立即可搜索的,最多需要等1秒才可搜索(index.refresh_interval由这个参数...
  • java多线程wait为什么要用while而不是if

    千次阅读 多人点赞 2018-11-06 17:44:52
    对于java多线程的wait()方法,我们在jdk1.6的说明文档里可以看到这样一段话 ...方便讲解,我们来看一个被广泛使用的生产消费的例子。代码部分参考 郝斌java视频教程 部分改编。 /* 生产和消费 */ packag...
  • /// 执行数据库waitfor delay延时存储过程 /// 或者waitfor time定时存储过程 /// private void Button_DoSearch_Click(object sender, EventArgs e) { SqlCommand command = new SqlCommand("pro_StoreDelay", ...
  • Ansible(14)wait_for模块

    千次阅读 2018-08-14 23:30:31
    wait_for 只是用来在规定时间内检测,状态是否所期望的状态是才,才执行后续的操作 如: - name: Checking free port for transfer  wait_for:  host: {{ inventory_hostname }}  port: 6088  state: ...
  • java在使用内置锁实现消费者-生产者模式的时候,可以使用wait,notify,notifyAll三个方法,而且这三个方法都是基类Object的方法,要调用某一个对象的同步方法时,必须将其放在sycronized修饰的方法、对象、代码块里面,你...
  • for update 和 for update nowait 的区别

    万次阅读 2013-12-06 22:13:26
    for update 和 for update nowait 的区别 如果在select语句后加入了for update, 则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,直到数据被修改结束(被commit),马上自动...
  • fastboot wait for device

    千次阅读 2017-08-04 14:41:56
    ADB版本问题 fastboot版本问题; 360手机助手等软件影响,关闭! 操作步骤问题 (没有输入fastboot命令?) USB驱动不匹配,需要重装USB驱动。解决方法: 装一个驱动精灵后开启软件,再在上述模式下让驱动蹦出来,驱动...
  • 前言 最近在开发android的同时也在开发java ,碰到了需要使用java 程序调用exe的需求,这里我使用的 process 来调用的。该篇文章 读完需要8+分钟,...waitfor挂起解析 1. 使用process调用exe程序 ProcessBuild...
  • Process.waitFor设置超时

    千次阅读 2014-08-18 16:34:00
    一般会调用Process.waitFor()来等待命令执行结束 获取执行结果 今天一个悲剧的事实证明了 即使只是调用了很简单的脚本命令 在调用Process.waitFor()后同样可能发生无休止或者接近于无休止的阻塞 处理完故障之后...
  • for update nowait 锁表解决办法

    千次阅读 2019-09-18 15:19:06
    1、查看被锁表信息 select b . owner , b . object_name , a . session_id , a . locked_mode , c . username , c . sid , c . serial #, c ...--其中7sid,9707serial#。
  • Process的waitFor死锁问题及解决办法

    千次阅读 2020-11-12 14:26:06
    经过查找资料了解到:Process.waitFor可能导致死锁? 因为本地的系统对标准输入和输出所提供的缓冲池有限,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程死锁。问题的关键在缓冲区这个...
  • nowait 子句用于消除隐式的 barrier(implicit barrier) 隐式 barrier 我们一个知道,在 OpenMP 中,有许多...for子句后等等 以下面的代码例 没有 nowait int main() { #pragma omp parallel { int id = omp_...
  • Process#waitFor()阻塞问题

    千次阅读 2019-04-02 20:01:15
         有时需要在程序中调用...int exitCode = process .waitFor();   Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与...
  • SQL:waitfor的使用

    千次阅读 2017-10-25 12:21:32
    用途有两个: 1、延迟一段时间后执行 比如: waitfor delay '00:00:05' print '延迟5秒执行!' --5秒后执行print 2、指定从何时起执行 比如: waitfor time '21:17' print '21:17执行' --到21:17的时候才...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 559,502
精华内容 223,800
关键字:

wait为什么加for