oracle lock

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.如果建立必须要对外键建索引。

猜你喜欢

转载自jamesqian.iteye.com/blog/1911579