引起Oracle阻塞的原因
1、select for update
2、外键没有创建索引
(1)主表上有频繁的删除操作
(2)主键上有频繁的修改操作
(3)业务上经常会出现主表和从表进行关联查询
当第一个和第二个条件操作的时候,主表会在从表上创建一个锁定,以保证主表主键的修改不会导致从表的数据在引用上不会出现问题。
如果经常对主表的主键进行修改都将导致从表被长时间锁定。比如主表每次删除1000条记录,它将扫描从表1000次,以确定每一行记录的改变
不会造成从表的引用不完整。因此,在从表的外键上应该创建索引。
oracle阻塞和锁
1.没有并发,就没有锁。
在数据库中,并发的意思是超过两个(含)以上的用户对同样的数据进行修改(包括插入、修改、删除),并行的意思是将一件事情分成很多小的部分,让每一部分同时执行,最后将执行结果进行汇总。并发和并行是不同的,没有并发,就没有锁。这里主要介绍TM锁和TX锁。
其实,TM锁更像是一个段级的锁,通常我们叫它表锁,是因为我们把这个表看成了一个段。当某个表中有几个段的时候,可能一个段上有TM锁,而另外的段中没有TM锁(可以进行DDL操作)。TX锁实际上应该叫做事务锁,它主要是为了维护是事务的一致性,从这个角度来看,TX锁并非都是在对数据进行修改时才产生的,只要需要维护事务的一致性,就需要用到该锁。例如分布式事务,一般来说就是通过dblink在几个数据库中处理数据,因为是分布式的操作方式,所以需要一个事务的总协调者,这时候即使都是读取操作,依然需要一个TX锁来维护事务的一致性。
Oracl中锁的信息是数据库的一个属性,是物理的,并不是逻辑上属于某个表或者某个行。在TX锁中,id1和id2构成了事务在回滚段中的位置。它(id1和id2)的用处是,当其他操作需要读取这个数据块时,会发现这个数据块上有活动的事务,因此需要到回滚段中去找该数据库之前的内容,那么这些内容在回滚段的什么地方?这两个值就告诉了你。对于TM锁,id1就是加锁的段对象,可以是一个表或者表上的一个分区,id2一般为0。
2.select for update (no wait)
3.外键和索引
如果系统中有主、外键引用关系,并且满足以下情况之一,那么就应该考虑在外键字段中创建索引,以提高系统性能。
*主表上有频繁的删除操作
*主表上有频繁的修改操作
*业务上经常对主表和从表进行关联查询