0
点赞
收藏
分享

微信扫一扫

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键

小磊z 2022-06-10 阅读 122

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_oracle

Oracle 数据库作为业界的翘楚,这么多年没有深入实在是......,每种数据库都有自己独有的特性,知晓这些特性或者共性,就可以做到根据目前公司的情况,业务的情况,甚至是程序员的LEVEL,来找寻更适合当下的数据库。ZIP My Fly, next.


最近学习了一些关于ORACLE 锁的概念,来总结一些,很 Junior, 资深的ORACLE  DBAER 们,凑合着看,欢迎指正。


——————————————————————————————

Oracle 在锁上面主要分为两大类

1 Enqueues 

2 Latches


Enqueues 主要是应用或者更直白的说DML 产生的锁,这是应用使用数据库进行 INSERT UPDATE DELETE SELECT 产生的锁

Latches ,这主要是系统内部的锁,尤其常见于BUFFER 内存管理中,保证数据完整和事务性以及数据库特殊内部架构下操作数据时产生了所,俗称闩锁。


说道这里,还的对比着看,SQL SERVER 和 MYSQL 中 LOCK 的种类可能要比ORACLE 要多,尤其是SQL SERVER, 锁的种类在数据库界,(包含POSTGRESQL),那绝对是NO.1,这和数据库的底层存储架构以及数据灌入BUFFER  及数据的DML 操作挟制有关。


那ORACLE 中有什么特性是别的数据库没有的,也成就了ORACLE 数据库在数据库界有着不可动摇地位的其中有两点(目前学习中获知,并非只有两点)。


1  读不会阻塞阻塞写 (排除 select for update)

2  写不会阻塞读          (回滚段在起着作用)


或许在ORACLE DBA中觉得,这不是很正常嘛,NO NO NO ,这绝对是ORACLE 数据库最大的卖点之一, 要知道 其他数据库(PG未知),在此方面可能通过部分手段来达到部分ORACLE 的这两个特性,而ORACLE 则自带这两个功能,Bravo.

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_外键_02

ORACLE中有TM 和  TX 两种类型的锁,前者是防止 DML时进行 DDL的操作的锁,后者是事务锁。而我们要研究的也就是TX锁。


说道锁,要知道锁的模式,这是所有数据库都有的概念


ORALCE 中到底有哪几种锁的模式:

0:none 
1:null 空 
2:Row-S 行共享(RS):共享表锁,sub share  
3:Row-X 行独占(RX):用于行的修改,sub exclusive  
4:Share 共享锁(S):阻止其他DML操作,share 
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive  
6:exclusive 独占(X):独立访问使用,exclusive


下面这张图很清晰的说明了ORACLE 锁MODE的之间那些可以和平共处,那些则是有你没我,你死我活的阵仗。清晰明了,如果让我画出SQL SERVER的 锁MODE,那我估计满屏都不够用

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_数据库_03

有人可能问,知道这些干嘛,当然有用,在操作用哪些资源被锁定,产生死锁或者 LOCK (oracle 官方名词 enqueues),是要对数据库性能产生根本性的影响。


现在做几个实验:


1 建立一个表  create table t (id int primary key);

insert into t (id) values (1);

update t set id = 2 where id = 1;  (在一个 SQLPLUS中不要COMMIT)

update t set id = 3 where id =1 ; (应该被阻塞了)通过

下面的查询我们可以很清晰的看到有一个BLOCK  并且需要的是 6号MODE


SELECT SID,TYPE,id1, id2,lmode,request,BLOCK FROM v$lock WHERE TYPE IN ('TM','TX') ORDER BY 1,2;


我们可以看到 SID 20 在请求一个 6号的 X锁,而 148的TX锁有BLOCKED 其他线程的锁。

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_数据库_04

其实很明显,上面的查询可以清楚的明白线程的阻塞情况。通过下面的查询也很明显的看到,20号的查询已经在等待 enqueues 类型的锁。


ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_oracle_05


说道这里,我必须要回应题目中我个人的一个见解,在大型并发高的系统,不要用外键。

我们来做一个实验:

create table p (id int primary key);

create table c (id references p(id));

insert into p (id) values (1);

我们继续看,在主表中插入一条数据,可以看到在P 表上插入一条数据不光要给P表加 TM锁,同时还要给 C 表加 TM 锁

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_外键_06

可以通过下面的查询获得 ID1 中产生TM锁的表

ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_数据库_07

的确我们在操作P表的时候 C表也会被加上TM锁,DDL锁。相同,在从表上插入数据的时候,主表也要加相应的TM锁。 


这样的锁定在ORACLE 里面有一个名词 叫 RI 锁, DBA都应该明确,任何的锁都要有资源的消耗,以及产生各种BLOCKED 的可能性。一般大型的系统中都是要避免过多的锁,提高系统的并发性。并且我们在主表DML操作时,要根据约束性扫描从表的,如果没有索引,操作是要对从表进行一次全表扫描的,,这就加大了数据处理的耦合性,对数据库并发性产生不好的影响。现在大部分数据库尤其是OLTP 的系统中,是非常不建议使用主外键关联的。(部分传统行业还在使用主外键的原因还是对程序设计的不信任,以及业务的重要性决定的,并且这部分系统对并发性的要求较低)主外键兴盛,主要是由于早期程序语言和程序设计的不成熟不完善,需要通过数据库来进行辅助保证逻辑正确性,所以早期系统大多还是使用主外键,(早期学习FOXPRO VF时,是非常热衷主外键的,大约是22年前)。


而现在随着数据量越来越大,程序设计越来越完善,分布式设计,MQ,还有很多我不知道的工具和架构(程序员威武),保证逻辑的正确性,程序设计变得越来越强大的情况下,高并发,大数据量的数据库设计早已不青睐用主外键来完成业务的逻辑性。 尤其互联网使用MYSQL数据库,彻底将外键踢出数据库设计的历史舞台,这也是高等级程序设计的趋势。


——————————————————————————————


那为什么ORACLE 有上面谈到的独门秘籍,这就要涉及ORACLE 的 BUFFER CACHE 原理了,困了,待续..........


ORACLE Learning ONE -- ORACLE 锁,及大型并发系统为什么反对建立外键_外键_08


举报

相关推荐

0 条评论