两个SQL的锁表问题
来自百度
请问:
1、insert into select ...这条将数据从一个表导入另一个表的语句
2、delete from ... where ...删除语句
以上两条SQL是否会锁表?也就是在执行以上两条SQL时是否无法对表进行其它的INSERT或UPDATE操作?谢谢!
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操作。
另:一楼说的是对的。
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操作。
另:一楼说的是对的。
posted on 2016-10-21 15:24 EchoLong333 阅读(391) 评论(0) 编辑 收藏 举报