注册
达梦DCP学习备考中物化视图和锁机制总结
专栏/培训园地/ 文章详情 /

达梦DCP学习备考中物化视图和锁机制总结

滚石 2024/04/24 1036 0 0
摘要

一、物化视图
物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本,占用存储空间,即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据发生更新,必须启用刷新机制才能保证数据是最新的。

物化视图可以用于数据复制(Data Replication),也可用于数据仓库缓存结果集以此来提升复杂查询的性能。

1.1、测试数据准备
CREATE USER DCP IDENTIFIED BY 123456789;

GRANT DBA TO DCP;

CREATE TABLE "DCP"."TEST"
(
"ID" INT PRIMARY KEY,
"TEST_DATE" DATE) STORAGE(ON "MAIN", CLUSTERBTR) ;

INSERT INTO "DCP"."TEST" SELECT LEVEL,SYSDATE() FROM DUAL CONNECT BY LEVEL<=10;

COMMIT;
1.2 参数介绍及实操
刷新模式:
1.2.1 FAST 根据相关表上的数据更改记录进行增量刷新。
普通 DML 操作生成的记录存在 于物化视图日志。使用 FAST 刷新之前,必须先建好物化视图日志。
例子:

CREATE MATERIALIZED VIEW LOG ON DCP.TEST
WITH primary key
PURGE START WITH SYSDATE NEXT SYSDATE+1;

CREATE MATERIALIZED VIEW DCP.MATERIALIZED_VIEW_10
BUILD immediate
REFRESH FAST
ON DEMAND
WITH primary key
DISABLE QUERY REWRITE
AS
SELECT * FROM DCP.TEST;

INSERT INTO DCP.TEST VALUES(14,SYSDATE);
COMMIT;

select * from "DCP".MATERIALIZED_VIEW_10;

REFRESH MATERIALIZED VIEW "DCP".MATERIALIZED_VIEW_10 FAST;
image.png
1.2.2. COMPLETE 通过执行物化视图的定义脚本进行完全刷新。
例子:

CREATE MATERIALIZED VIEW DCP.MATERIALIZED_VIEW_11
BUILD immediate
REFRESH complete
ON DEMAND
WITH primary key
DISABLE QUERY REWRITE
AS
SELECT * FROM DCP.TEST;

INSERT INTO DCP.TEST VALUES(15,SYSDATE);
COMMIT;

select * from "DCP".MATERIALIZED_VIEW_11;
image.png
1.2.3. FORCE 默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。
例子:

CREATE MATERIALIZED VIEW DCP.MATERIALIZED_VIEW_12
BUILD immediate
REFRESH force
ON DEMAND
WITH primary key
DISABLE QUERY REWRITE
AS
SELECT * FROM DCP.TEST;

INSERT INTO DCP.TEST VALUES(16,SYSDATE);
COMMIT;

REFRESH MATERIALIZED VIEW "DCP".MATERIALIZED_VIEW_12 force;

select * from "DCP".MATERIALIZED_VIEW_12;
image.png

二、锁机制
2.1、锁概述
锁是一种防止相互数据破坏的机制。当在访问共享数据的事务之间,错误的更新数据或更改数据结构,将引起数据一致性被破坏。锁在维护数据库并发性和一致性方面起着至关重要的作用
DM 数据库支持多用户并发访问、修改数据,有可能出现多个事务同时访问、修改相同
数据的情况。若对并发操作不加控制,就可能会访问到不正确的数据,破坏数据的一致性和
正确性。
封锁机制是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据库对象进
行操作前,需要先对其封锁。封锁后事务就对该数据库对象有了一定的控制,在该事务释放
锁之前,其他的事务不能对此数据库对象进行相应操作。
2.2、锁模式
锁模式指定并发用户如何访问锁定资源。DM 数据库使用四种不同的锁模式:共享锁、排他锁、意向共享锁和意向排他锁。
2.2.1 共享锁
共享锁(Share Lock ,简称 S 锁)用于读操作,防止其他事务修改正在访问的对象。
这种封锁模式允许多个事务同时并发读取相同的资源,但是不允许任何事务修改这个资源。
2.2.2 排他锁
排他锁(Exclusive Lock ,简称 X 锁)用于写操作,以独占的方式访问对象,不允许任
何其他事务访问被封锁对象;防止多个事务同时修改相同的数据,避免引发数据错误;防止
访问一个正在被修改的对象,避免引发数据不一致。一般在修改对象定义时使用。
2.2.3 意向锁
意向锁(Intent Lock )用于读取或修改被访问对象数据时使用,多个事务可以同时对
相同对象上意向锁, DM 支持两种意向锁:

  1. 意向共享锁( Intent Share Lock ,简称 IS 锁):一般在只读访问对象时使用;
  2. 意向排他锁( Intent Exclusive Lock ,简称 IX 锁):一般在修改对象数据时使用。
    四种锁模式的相容矩阵如下表所示,其中“Y” 表示相容; “N” 表示不相容。
    如表中第二行 第二列为“Y” ,表示如果某个事务已经加了 IS 锁时,其他事务还可以继续添加 IS 锁,第二行 第五列为“N” ,表示如果某个事务已经加了 IS 锁时,其他事务不能添加 X 锁。
    image.png
    2.3 达梦锁粒度
    按照封锁对象的不同,达梦的锁可以分为 TID 锁和对象锁。
    2.3.1 TID 锁
    TID锁是达梦数据库中用于控制并发访问的一种锁机制。它以事务号作为锁的对象,为每个活动事务生成一把TID锁,用于防止多个事务同时修改同一行记录。与其他数据库的行锁不同,TID锁代替了行锁的功能。
    举个例子来说明,假设有两个事务T1和T2同时想要修改同一行数据。在达梦数据库中,每个事务都有一个唯一的事务号(TID)。当T1开始执行修改操作时,它会把自己的事务号(TID1)设置到该行数据的TID字段中,相当于为该行数据隐式地加上了一把TID锁。此时,T1可以安全地修改这一行数据。而当T2也开始执行修改操作时,它发现该行数据的TID字段已经被T1占用了。此时,T2会生成一个新的TID锁,其锁对象为TID1(T1的事务号),而不是事务T2本身。这样,T2就知道该行数据正在被其他事务修改,并且需要等待T1完成修改后才能执行自己的修改操作。
    TID锁的一个优点是它避免了大量行锁对系统资源的消耗。在执行INSERT、DELETE、UPDATE操作时,不再需要额外的行锁,而是通过设置事务号到TID字段来隐式地加上TID锁。只有多个事务同时修改同一行记录时,才会产生新的TID锁。
    此外,达梦数据库还采用了多版本并发控制(MVCC)的方式。每一行记录都隐含一个TID字段,用于事务可见性判断。这意味着SELECT操作已经消除了行锁的概念,读操作不会被写操作阻塞。
    2.3.2 对象锁
    对象锁是 DM 新引入的一种锁,通过统一的对象 ID 进行封锁,将对数据字典的封锁和
    表锁合并为对象锁,以达到减少封锁冲突、提升系统并发性能的目的。
    2.4 锁管理机制与步骤
    锁的管理这时候就需要引入锁管理中心的这个概念了,锁管理中心用于保锁的正确获取、释放和管理。
    2.5 查看达梦锁,相关系统表
    DM 数据库专门提供了一个 V$LOCK 动态视 图。通过该视图,用户可以查看到系统当前所有锁的详细信息,如锁的内存地址、所属事务 ID、锁类型、锁模式等。用户可以通过执行如下语句查看锁信息。
    image.png

SELECT * FROM V$LOCK;
可以看到有很多列,
addr: 该列表示锁所存储的内存地址
irx_id: 锁所属的事务 ID
ltype:锁类型,对象锁,tid锁
lmode:锁的模式,is,ix,s,x四种模式
BLOCKED :锁是否处于上锁等待状态,0 表示已上锁成功,1 表示处于上锁等待状态
table_id:表示表对象或字典对象的 ID,对于 TID 锁,表示封锁记录对应的表 ID
ROW_IDX :改列为 TID 锁封锁记录的行信息
tid:TID 锁对象事务 ID

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服