select for update

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select for update相关的知识,希望对你有一定的参考价值。

请问:
1、使用select ... where ... for update时,可以同时进行insert操作么?我尝试过好像可以。
2、使用select ... where ... for update,只有执行commit后,才能继续使用select ... where ... for update执行?如果同时有两条:select ... where ... for update,那肯定只有一条在执行,当commit后,另外一条才能继续执行?我尝试过好像可以

想再确认下,谢谢!
select ... for update不影响其它SQL的操作,除了另一条同样的select ... for update?

参考技术A 规则是:FOR UPDATE语句将锁住查询结果中的元组,这些元组将不能被其他事务的UPDATE,DELETE和FOR UPDATE操作,直到本事务提交。
所以
1、可以
2、是的本回答被提问者和网友采纳

select * from salgrade for update和select * from salgrade for update nowait区别

1,select * from salgrade for update

session1 session2

SQL> delete salgrade where grade=1;

1 row deleted.

 
 

SQL> select * from salgrade for update;

此时session2被阻塞

SQL> rollback;

Rollback complete.

 
 

 

     GRADE    LOSAL       HISAL
---------- ---------- ----------
     1      700        1200
     2     1201        1400
     3     1401        2000
     4     2001        3000
     5     3001        9999

被阻塞的session2立马返回了结果,但同时这句也为表加了锁

SQL> delete salgrade where grade=1;
session1被阻塞
 
 

SQL> rollback;

Rollback complete.

1 row deleted.

session1获得资源,执行完毕

 

总结来看,select * from salgrade for update有以下特征:

①如果结果集已经被另一个会话锁定,就会发生阻塞。需要等另一个会话结束之后才可继续执行。

②它会对结果集加锁

2,select * from salgrade for update nowait

session1 session2


SQL> delete salgrade where grade=1;

1 row deleted.

 
 

SQL> select * from salgrade for update nowait;
select * from salgrade for update nowait
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

SQL> rollback;

Rollback complete.

 
 

SQL> select * from salgrade for update nowait;

     GRADE    LOSAL       HISAL
---------- ---------- ----------
     1      700        1200
     2     1201        1400
     3     1401        2000
     4     2001        3000
     5     3001        9999

SQL> delete salgrade where grade=1;

session1此时被阻塞
 
 

SQL> rollback;

Rollback complete.

1 row deleted.

session1得到资源,执行完毕

 

总结来看,select * from salgrade for update nowait有以下特征:

①如果结果集已经被另一个会话锁定,会立即返回ORA-00054错误

②该语句本身同样也会对结果集加锁

 

综合总结,这两句语句的作用都是对结果集加排他锁,禁止其他会话做DML作业,如果希望在select期间,结果集不被修改,即可以选择这种方式。

以上是关于select for update的主要内容,如果未能解决你的问题,请参考以下文章

UGUI事件系统

图书管理系统(微信后台网页端)总结

如何在javascript中设置选择2框的默认值

RestTemplate put请求,参数传递不进去

oracle 多表更新update,返回多行

select for update