两个SQL的锁表问题

Posted EchoLong

tags:

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

来自百度

请问:

1、insert into select ...这条将数据从一个表导入另一个表的语句
2、delete from ... where ...删除语句
以上两条SQL是否会锁表?也就是在执行以上两条SQL时是否无法对表进行其它的INSERT或UPDATE操作?谢谢!
我的意思是执行:
insert into TABLE_B select * from TABLE_A;和
delete from TABLE_B where ID <= 10;
这两条SQL执行的同时,还能对TABLE_A和TABLE_B进行INSERT或UPDATE操作么?

那如果UPDATE那些记录并不是
insert into TABLE_B select * from TABLE_A;和
delete from TABLE_B where ID <= 10;
的子集,这样可以同时进行吧?
最佳答案
 
不同的数据库,多版本的实现机制不同,上述语句执行情况也就不一样,下面以oracle为例说明:

1.insert/delete语句可以并发执行,不会锁等待
2.并发insert不会锁等待
3.并发update,如果不是操作同一条记录,不会锁等待
=================================================
对真实存在的数据进行并发操作才有可能发生写冲突,所以楼主只要把握住这点就可以判断是否会冲突了。

建议楼主构造简单数据,开两个客户端,在不同的隔离级下去模拟并发操作,理论和实践相结合,你会理解的更透彻。
 

其他回答

不是很明白的你的意思,查看是否锁表的sql:
select s.SID,s.SERIAL#,s.username, 
decode(l.type,‘TM‘,‘TABLE LOCK‘, 
‘TX‘,‘ROW LOCK‘, 
NULL) LOCK_LEVEL, 
o.owner,o.object_name,o.object_type,s.terminal,s.machine,s.program,s.osuser 
from v$session s,v$lock l,dba_objects o 
where s.sid=l.sid 
and o.object_id=l.id1 
and s.username is not null ;
如果1 .2是同时操作一张表,最好是执行完一条sql先commit一下在执行第二条这样肯定不会锁表,我不知道我理解对了没有? 
ps:不能,数据库的事务机制不允许同一时刻同一记录update 如果先update操作会先lock table等执行完释放资源才有其他的操作。 
以下是我做过的测试:
eg:select * from table for update; 
1.不允许做for update查询。 
2.允许普通search查询。
3.不允许对表中任何记录做update操作; 
4.允许insert操作; 
5.不允许delete操作。 
另:一楼说的是对的。

以上是关于两个SQL的锁表问题的主要内容,如果未能解决你的问题,请参考以下文章

数据库的锁——代码实战篇

数据库的锁——代码实战篇

关于MYSQL中的锁

H2数据库中具有独占性的锁表

Oracle的锁表与解锁

Oracle的锁表与解锁