oracle里面的insert会锁表原因是什么?
oracle中insert会锁表;当oracle执行insert等DML语句时,会在所操作的表上申请一个锁,两个insert语句同时试图向一个表进行操作时,就会造成会话被堵塞,等待其他会话提交或回滚,因而造成死锁。
本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。
oracle中insert会锁表吗
oracle中insert会锁表
当ORACLE执行insert等DML语句时,会首先自动在所要操作的表上申请一个TM锁,当TM锁获得后,再自动申请TX类型的锁。当两个或多个会话在表的同一条记录上执行DML语言时,第一个会话在记录上加锁,其它的会话处于等待状态,一直到第一个会话提交后TX锁释放,其它的会话才可以加锁。
考虑是因为两个insert语句同时试图向一个表中插入PK或unique值相同的数据,而造成其中会话被阻塞,等待其它会话提交或回滚,因而造成死锁。
这种情况,只要其中任何一个session提交,另外一个就会报出ORA-00001:违反唯一性约束条件,死锁终止;或者其中一个session回滚,另外一个即可正常执行。
在oracle中,锁表的原因是当一个程序执行了对一个表的insert,并且还未commite时,另一个程序也对同一个表进行insert,则此时就会发生资源正忙的异常,也就是锁表。
主要的锁表原因有:
(1) A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表
(2)锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)
减少锁表的概率方法:
(1)减少insert 、update 、delete 语句执行 到 commite 之间的时间。具体点批量执行改为单个执行、优化sql自身的非执行速度
(2)如果异常对事物进行回滚
锁表原因可能是修改了行数据,忘了提交,也会造成锁表。
扩展知识:
锁表建议先查原因再做决定。
1锁表查询的代码有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
2.查看哪个表被锁
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
3查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
以上就是关于oracle里面的insert会锁表原因是什么?的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注网络,小编每天都会为大家更新不同的知识。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: oracle里面的insert会锁表原因是什么?
本文地址: https://pptw.com/jishu/649991.html
