1. 数据库逻辑结构图
- Database,即数据库,用于管理各类数据对象,各数据库间相互隔离。数据库管理的对象可分布在多个Tablespace上。
- Datafile Segment,即数据文件,通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储。
- Table,即表,每张表只能属于一个数据库,也只能对应到一个Tablespace。每张表对应的数据文件必须在同一个Tablespace中。
- Block,即数据块,是数据库管理的基本单位,默认大小为8KB。
2. 数据查询请求的处理过程
3. 管理事务
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。GaussDB 数据库支持的事务控制命令有启动、设置、提交、回滚事务。GaussDB 数据库支持的事务隔离级别有读已提交、事务可重复读。
1. 事务控制
-------------------------------------启动事务-------------------------------------
格式一:START TRANSACTION 格式
START TRANSACTION
[
{
ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY }
} [, ...]
];
格式二:BEGIN 格式
BEGIN [ WORK | TRANSACTION ]
[
{
ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY }
} [, ...]
];
参数说明
WORK | TRANSACTION
BEGIN格式中的可选关键字,没有实际作用。
ISOLATION LEVEL
指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。
READ WRITE | READ ONLY
指定事务访问模式(读/写或者只读)
注意:在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。
示例
--以默认方式启动事务。
START TRANSACTION;
SELECT * FROM tpcds.reason;
END;
--以默认方式启动事务。
BEGIN;
SELECT * FROM tpcds.reason;
END;
--以隔离级别为READ COMMITTED,读/写方式启动事务。
START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
SELECT * FROM tpcds.reason;
COMMIT;
-------------------------------------设置事务-------------------------------------
语法格式
设置事务的隔离级别、读写模式。
{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }
{ ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
| { READ WRITE | READ ONLY } } [, ...]
参数说明
LOCAL
声明该命令只在当前事务中有效。
SESSION
声明这个命令只对当前会话起作用。
取值范围:字符串,要符合标识符的命名规范。
ISOLATION_LEVEL_CLAUSE
指定事务隔离级别,该参数决定当一个事务中存在其他并发运行事务时能够看到什么数据。
READ WRITE | READ ONLY
指定事务访问模式(读/写或者只读)
注意:在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。
示例
--开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。
START TRANSACTION;
SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;
COMMIT;
-------------------------------------提交事务-------------------------------------
注意:执行COMMIT这个命令的时候,命令执行者必须是该事务的创建者或系统管理员,且创建和提交操作可以不在同一个会话中。
语法格式
{ COMMIT | END } [ WORK | TRANSACTION ] ;
参数说明
COMMIT | END
提交当前事务,让所有当前事务的更改为其他事务可见。
WORK | TRANSACTION
可选关键字,除了增加可读性没有其他任何作用。
示例
--创建表。
CREATE TABLE tpcds.customer_demographics_t2
(
CD_DEMO_SK INTEGER NOT NULL,
CD_GENDER CHAR(1) ,
CD_MARITAL_STATUS CHAR(1) ,
CD_EDUCATION_STATUS CHAR(20) ,
CD_PURCHASE_ESTIMATE INTEGER ,
CD_CREDIT_RATING CHAR(10) ,
CD_DEP_COUNT INTEGER ,
CD_DEP_EMPLOYED_COUNT INTEGER ,
CD_DEP_COLLEGE_COUNT INTEGER
)
WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
DISTRIBUTE BY HASH (CD_DEMO_SK);
--开启事务。
START TRANSACTION;
--插入数据。
INSERT INTO tpcds.customer_demographics_t2 VALUES(1,'M', 'U', 'DOCTOR DEGREE', 1200, 'GOOD', 1, 0, 0);
INSERT INTO tpcds.customer_demographics_t2 VALUES(2,'F', 'U', 'MASTER DEGREE', 300, 'BAD', 1, 0, 0);
--提交事务,让所有更改永久化。
COMMIT;
--查询数据。
SELECT * FROM tpcds.customer_demographics_t2;
--删除表tpcds.customer_demographics_t2。
DROP TABLE tpcds.customer_demographics_t2;
-------------------------------------回滚事务-------------------------------------
注意:如果不在一个事务内部发出ROLLBACK不会有问题,但是将抛出一个警告信息。
**语法格式**
ROLLBACK [ WORK | TRANSACTION ];
参数说明
WORK | TRANSACTION
可选关键字。除了增加可读性,没有任何其他作用。
示例
--开启一个事务
START TRANSACTION;
--取消所有更改
ROLLBACK;
2. 事务隔离级别
事务隔离级别,它决定多个事务并发操作同一个对象时的处理方式。
注意:在事务中第一个数据修改语句(SELECT,INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。
READ COMMITTED
读已提交隔离级别。事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。
实际上,SELECT查询会查看到在查询开始运行的瞬间该数据库的一个快照。不过,SELECT能查看到其自身所在事务中先前更新的执行结果。即使先前更新尚未提交。请注意,在同一个事务里两个相邻的SELECT命令可能会查看到不同的快照,因为其它事务会在第一个SELECT执行期间提交。
因为在读已提交模式里,每个新的命令都是从一个新的快照开始的,而这个快照包含所有到该时刻为止已提交的事务,因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里绝对一致的视图。
读已提交模式提供的部分事务隔离对于许多应用而言是足够的,并且这个模式速度快,使用简单。不过,对于做复杂查询和更新的应用,可能需要保证数据库有比读已提交模式更加严格的一致性视图。
READ UNCOMMITTED
读未提交隔离级别。GaussDB 不支持READ UNCOMMITTED,如果设置了READ UNCOMMITTED,实际上使用的是READ COMMITTED。
REPEATABLE READ
事务可重复读隔离级别。事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败。
SERIALIZABLE
事务可序列化。GaussDB 不支持SERIALIZABLE,如果设置了SERIALIZABLE,实际上使用的是REPEATABLE READ。
4. 相关概念
数据库
数据库用于管理各类数据对象,与其他数据库隔离。创建数据时可以指定对应的表空间,如果不指定相应的表空间,相关的对象会默认保存在PG_DEFAULT空间中。数据库管理的对象可分布在多个表空间上。
表空间
在GaussDB 中,表空间是一个目录,可以存在多个,里面存储的是它所包含的数据库的各种物理文件。由于表空间是一个目录,仅是起到了物理隔离的作用,其管理功能依赖于文件系统。
模式
GaussDB 的模式是对数据库做一个逻辑分割。所有的数据库对象都建立在模式下面。GaussDB 200的模式和用户是弱绑定的,所谓的弱绑定是指虽然创建用户的同时会自动创建一个同名模式,但用户也可以单独创建模式,并且为用户指定其他的模式。
用户和角色
GaussDB 使用用户和角色来控制对数据库的访问。根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数据库用户。在GaussDB 中角色和用户之间的区别只在于角色默认是没有LOGIN权限的。在GaussDB 中一个用户唯一对应一个角色,不过可以使用角色叠加来更灵活地进行管理。
事务管理
在事务管理上,GaussDB 采取了MVCC(多版本并发控制)结合两阶段锁的方式,其特点是读写之间不阻塞。GaussDB 的MVCC没有将历史版本数据统一存放,而是和当前元组的版本放在了一起。GaussDB 没有回滚段的概念,但是为了定期清除历史版本数据GaussDB 引入了一个VACUUM进程。一般情况下用户不用关注它,除非要做性能调优。此外,GaussDB 是自动提交事务。