RI锁---基于引用关系的锁定
� 当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表
上也可能加上相应的锁定。 (当含有主外键的表进行DML操作的时候也会产生锁定,比如在1主表上面做一些操作可能导致从表造成锁定)
SQL> create table p(id int primary key);
Table created.
SQL> create table c(id references p(id));
Table created.
SQL> insert into p values(1);
1 row created.
这里创建了两个表p是主表,c是从表,向主表里面插入一条数据。
SQL> select object_name from dba_objects where object_id in (88652,88654);
OBJECT_NAME
--------------------------------------------------------------------------------
P
C
可以看到当在主表进行插入数据的时候,不仅会在主表上面加上TM,TX锁,同时会在从表上加上表级锁来防止从表被删除。
当进行update和delete的时候不会在从表上面加上TM锁,下面演示的是update。
在主表里面插入数据,未提交,之后再到从表去插入数据,这里主表和从表插入的数据都是同一条数据,这样才不违反参照性约束。
第一个session:
SQL> insert into p values(1);
1 row created.
第二个session:
SQL> insert into c values(1); --可以看到被阻塞了
这里可以看到当往主表里面插入数据的时候可能会阻塞从表里面插入数据。
不同版本数据库锁的差异
锁在不同的数据库里面版本也不一样,优化器在不同版本的数据库里面变化差异也比较大。
BI锁和外键索引---没有索引的外键
在对主键进行操作的时候要对外键进行操作,因为在主表里面删除一条记录的时候要去看外键的表里面有没有这条记录,这个时候就需要对外键的表进行一次扫描。当外键的表在外键上没有建立索引的时候,那么就要在整个外键里面扫一遍,因为没有索引,所以要将整个外键扫一遍,这是一个相当费时的过程,一旦在从表上扫描外键就会加上锁,这个锁是在扫描的过程当中一直存在的,这样就会导致阻塞。
表的外键上面还是最好建立索引,建立索引没有多大的坏处。没有外键一旦对主表进行操作就会在外键上面加上锁,同时整个扫描外键。
BI锁和外键索引---有索引的外键
这个和上面有对比,不建议修改主键的值,主要就是主键和外键的修改会导致锁的产生。