关于主外键关系DML父表和DML子表加锁方式

简介: 原创 转载请注明出处 当存在主外键关系时候不管是更新主表还是子表都会出现对应的LOCK,解释如下: 实验 SQL> create table test1  2  (id int); SQL> alter table TEST1  2    add con...

原创 转载请注明出处

当存在主外键关系时候不管是更新主表还是子表都会出现对应的LOCK,解释如下:


实验


SQL> create table test1
  2  (id int);

SQL> alter table TEST1
  2    add constraint TEST_PK primary key (ID);

 

SQL> insert into test1
  2  values(10);

1 row inserted

SQL> commit;

Commit complete

SQL> create table test2
  2  (id int);

Table created

SQL> alter table TEST2
  2    add constraint test_fk foreign key (ID)
  3    references test1 (ID);

Table altered

SQL> INSERT INTO TEST2
  2  VALUES(10);

1 row inserted

SQL> COMMIT;

Commit complete

然后开一个会话进行删除TEST2。出现LOCK模式如下
SQL> SELECT LOCK_TYPE,MODE_HELD,LOCK_ID1 FROM DBA_LOCKS WHERE SESSION_ID=150;

LOCK_TYPE                  MODE_HELD                                LOCK_ID1
-------------------------- ---------------------------------------- ----------------------------------------
Transaction                Exclusive                                327689
DML                        Row-X (SX)                               51297
DML                        Row-S (SS)                               51295

这里LOCK_ID1是对应的OBJECT_ID我的子表是51297父表是51295  ,子表加了表共享行独占,父表加了表共享行共享。

为了测试主表这样的问题,必须引入大量的数据

declare
  i number(10);
 begin
  for i in 11..10000000 loop
  insert into test1
  values( i);
  end loop;
 end ;

这样可以等待很长时间

锁的模式如下

SQL> select LOCK_TYPE,MODE_HELD,LOCK_ID1 from dba_locks where session_id=148;

LOCK_TYPE                  MODE_HELD                                LOCK_ID1
-------------------------- ---------------------------------------- ----------------------------------------
Transaction                Exclusive                                262169
DML                        Row-S (SS)                               51297
DML                        Row-X (SX)                               51295
51295父表 51297子表

也许要问SS 和SX的区别区别在于行的独占和共享,如

DML                        Row-S (SS)                               51297
DML                        Row-X (SX)                               51295

这样的模式我们队51295进行FOR UPDATE是不行的行级X和S是不兼容的

但是对51297进行FOR update是可以因为S和S兼容。

 

相关文章
|
7月前
|
存储 数据库 索引
事务、视图和索引
事务、视图和索引
|
2月前
|
数据库
SQL_语句常见的操作创建,使用,删除表和表级约束
SQL_语句常见的操作创建,使用,删除表和表级约束
35 0
|
5月前
|
SQL Oracle 关系型数据库
加索引导致表被锁的原因及处理方法
加索引导致表被锁的原因及处理方法
547 0
|
SQL 数据库 Python
根据外键倒查关联表
根据外键倒查关联表
|
SQL 数据库
查看锁表语句以及创建触发器
查看锁表语句以及创建触发器
|
数据库 索引
数据库中的主键、外键、索引的区别
数据库中的主键、外键、索引的区别
625 1
|
Oracle 关系型数据库 数据库
OGG重新同步表
OGG在线重新同步表的步骤
267 0
|
Java 数据库
不设外键:用程序来实现表之间的关联
Association 相信有很多同学都有使用过Hibernate框架的开发经验,尽管现在开发人员对Hibernate的褒贬不一,我们暂且不谈这个话题。
1761 1
|
存储 C#
C# 如何物理删除有主外键约束的记录?存储过程实现
十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE Dept--系/学院表 ( DeptId int identity(1,1) primary k...
1147 0