1.oracle的session可以有多个connection跟数据库进行连接,每个connection都可以开启transaction.oracle会提前检测到dead lock。如果一旦发生这样的错,oracle驱动会有错误给调用者。死锁的例子session1在执行DML语句时开启事务。过程是update记录A,然后记录B。事务没有提交。然后session2在请求的时候也开启了事务,过程是先update记录B,然后记录A。在某个恰当的时机,两个session的事务都没办法完成提交。会都在等待别transation释放资源。A上面存在行级锁,在B没有更新完毕且提交后,A上面的行级锁不会释放。同时B上面的行级锁已经被session2所拥有。所以session1无法拿到B的行级锁,因为无法完成update。对session2而言也是一样的道理。
2.解决的办法是update A B记录的时候,对于不同的session我们需要对记录数据的顺序有提前的约定。比如符合某种基于关键词的排序。这样去update时就不会出现死锁的现象。假设session1先开始updateA,此时session2只能等待,因为他的顺序也是也update记录A。等session1全部update完毕释放掉锁之后session2才能更新。这样就不会发生死锁的问题。
3.对于表建外键约束时,如果没有对子表相关的外键进行索引。这样的话每次update子表就会去全表扫描父表。且同时是锁定整个父表的(表级别的锁)。这种做法非常耗性能。通常的做法:1.不要在数据库端建立这种显式的主外键关系,依靠app端cover这种关系。2.如果建立必须要对外键建索引。
相关推荐
NULL 博文链接:https://mlaaalm.iteye.com/blog/682540
oracle-lock hh
查詢oracle table被那個使用者鎖住
NULL 博文链接:https://zdk2116.iteye.com/blog/981689
以下是对Oracle中Lock与Latch的相同点以及不同点进行了详细的分析介绍,需要的朋友参考下
当出现上述情况的时候,我们可以通过v$session_wait查询等待事件,当然,这种情况下,该session的等待事件一定是'Library cache lock'。 让我们来解释一下, 第一种情况,当会话1(session 1)在对一个表执行DML ...
Oracle中的Latch和Lock.pdf
ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他...
oracle 表锁 解决 主要用于解决oracle表锁的的问题与及步骤
BLOG_【故障处理】Oracle_lhr_队列等待之TX - row lock contentionBLOG_【故障处理】Oracle_lhr_队列等待之TX - row lock contentionBLOG_【故障处理】Oracle_lhr_队列等待之TX - row lock contention
一个Oracle Applications DBA(Oracle应用程序数据库管理员)不仅需要和其他DBA一样去负责managing、 sizing、maintaining和 tuning database这些日常的数据库管理的工作,如果他的Apps database是OLTP系统的话,他...
#!/bin/bash # chkconfig: 345 99 10 ...touch /var/lock/Oracle su - $ORA_OWNR -c "$ORACLE_HOME/bin/emctl start dbconsole" #su - $ORA_OWNR -c "$ORACLE_HOME/bin/isqlplusctrl start" echo "OK
library cache lock等待事件分析处理
ORACLE关于锁和V$LOCK的分析.docx
oracle锁的概念,oracle锁的分类,oracle锁的级别,oracle解锁方法
KFC系列之 - Oracle DBA入门Mysql(中)
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share 3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete and so on
FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C, v$lock d WHERE (A.OBJECT_ID = B.OBJECT_ID) AND (B.PROCESS = C.PROCESS) and C.sid = d.sid and B.LOCKED_MODE = D.LMODE ORDER BY 1, 2; --...