事务管理与MVCC

事务是为用户提供的最核心、最具吸引力的数据库功能之一。

事务是用户定义的一系列数据库操作(如查询、插入、修改或删除等)的集合从数据库内部保证了该操作集合(作为一个整体)的原子性(Atomicity)、一致性
(Consistency)、隔离性(lsolation)和持久性(Durability),这些特性统称事务的ACID特性。

A:原子性是指事务中的所有操作要么全部执行成功,要么全部执行失败。一个事务执行以后,数据库只可能处于上述两种状态之一,即使数据库在这些操作执行过程中发生故障,也不会出现只有部分操作执行成功的状态。
START TRANSACTION;
INSERT INTO t(a) VALUES(v1);
INSERT INTO t(a) VALUES(v2);
COMMIT;
C:一致性是指事务的执行会导致数据从一个一致的状态转移到另一个一致的状态,事务的执行不会违反一致性约束、触发器等定义的规则。
l:隔离性是指在事务的执行过程中,所看到的数据库状态受并发事务的影响程度。根据该影响程度的轻重,一般将事务的隔离级别分为读未提交、读已提交、可重复读和可串行化四个级别(受并发事务影响由重到轻)。
D:持久性是指一旦事务提交以后,即使数据库发生故障重启,该事务的执行结果不会丢失,仍然对后续事务可见。

根据分布式角色分为本地事务和全局事务

本地事务:普通事务,独立的一个数据库,保证在该数据库上操作的ACID,也叫单机事务,它是相对于全局事务而言的。
单机事务:在openGauss这样的分布式集群中,单机事务(亦称单分片事务)是指一个事务中所有的操作都发生在同一个分片(即DN)上
全局事务:涉及两个或多个数据库源的事务,即跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成的),全局事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库;

显式事务是指用户在所执行的一条或多条SQL后,显式添加了开启事务START TRANSACTION语句和提交事务COMMIT语句。
START TRANSACTION;
SELECT * FROM t;
INSERT INTO t(a) VALUES (100);
COMMIT;

隐式事务是指用户在所执行的一条或多条SQL语句的前后,没有显式添加开启事务和提交事务的语句。在这种情况下,每一条SQL语句在开始执行时,openGauss内部都会为其开启一个事务,并且在该语句执行完成之后,自动提交该事务。
两阶段事务2PC是分布式数据库和分布式系统中常见的事务模型,两阶段事务的架构中包含事务管理器和资源管理器等多个角色。
XA事务是2PC原子提交协议的一种实现,它通过引入协调者来统一参与者的步伐。
自治事务(Autonomous Transaction)将一个主事务分割成几个子事务,在执行完子事务以后再继续执行主事务。子事务是独立于主事务的,子事务中的ROLLBACK和COMMIT操作只会影响子事务中的DML操作;主事务中的ROLLBACK和COMMIT操作只会影响主事务中的DML操作,而不会影响子事务中的操作。在子事务中已经COMMIT的操作,不会被主事务中的ROLLBACK撤销
使用START TRANSACTION和BEGIN语法启动事务。

事务隔离级别

Vastbase只支持READ COMMITTED(读已提交隔离级别)和REPEATABLE READ(事务可重复读隔离级别);
SERIALIZABLE: Vastbase目前功能上不支持此隔离级别,等价于REPEATABLE READ

所谓预写日志,是指在事务提交的时候,先将事务对于数据库的修改写入一个顺序追加的WAL文件中。由于WAL的写操作是顺序lO,因此其可以达到一个比较高的性能。
对于真正修改的物理数据文件,再等待合适的时机写人磁盘,以尽可能合并该数据文件上的IO操作。在一个事务:记成日志的落盘操作(即写入磁盘)以后,该事务就可以完成提交动作。如果在此之后数据库发生崩溃,那么数据库会首先从已经写入磁盘的WAL文件中恢复出该事务对于数据库的修改操作,从而保证事务—旦提交即具备持久性的特点。

Vastbase G100数据库通过 WAL、事务提交信息日志clog以及更新记录的多版本来证写事务的原子性。

如果在事务写下提交日志之前,数据库发生宕机,那么数据库恢复过程中虽然会把这两条记录插入到数据页面中,但是并不会在CLOG中将该插入事务号标识为提交状态,后续查询也不会返回这两条记录。
如果在事务写下提交日志之店,数据库发生宕机,那么数据库恢复过程中,不仅会把这两条记录插入到数据页面中。同时,还会在CLOG中将该插入事务号标识为提交状态,后续查询可以同时看见这两条插入的记录。
如上,在故障场景下,上述插入两行记录的事务操作亦是原子性的。

在VB中,每个query在执行时,都会首先通过GetSnapshotData()来获取一张快照,这个快照可以认为是数据库在某一特定时间点下所有数据的集合,这张快照中包含的信息:
xmin,当前正在运行的事务集合中最小的xid值.所有在xmin之前的事务都被认为是已经结束的.xmax,当前结束运行的事务集合中最大的xid值.所有在xmax之后的事务都被认为是正在运行的

在VB中,有两种方法来实现快照:活跃事务数组法,时间戳方法。

解决的问题场景︰
并发执行的事务,某一个事务在执行过程中,它“眼中”其他所有并发事务的状态
在数据库业界,一般按由低到高将隔离性分为以下四个隔离级别:读未提交、读已提交、可重复读、可串行化。每个隔离级别按照在该级别下禁止发生的异常现象来定义。这些异常现象包括:
(1)脏读:指一个事务在执行过程中读到并发的、还没有提交的写事务的修改内容。
(2)不可重复读:指在同一个事务内,先后两次读到的同一条记录的内容发生了变化(被并发的写事务修改)。
(3)幻读:指在同一个事务内,先后两次执行的、谓词条件相同的范围查询,返回的结果不同(并发写事务插入了新记录)。

对于底层数据的访问和修改,如物理页面和元组为了保证读、写操作的原子性需要在每次的读、写操作期间加上共享锁或排他锁。当每次读、写操作完成之后,即可释放上述锁资源,无须等待事务提交,持锁窗口相对较短。
(一)读-读并发控制
在绝大多数情况下,并发的读-读事务是不会也没有必要相互阻塞的。只需要对它们加共享锁即可,不会发生锁等待的情况。
(二)读-写并发控制
VB中对于读、写事务的并发控制是基于MVCC和快照机制的,彼此之间不会存在事务级的长时间阻塞。相比之下,采用两阶段锁协议(Two-Phase Locking Protocol,2PL协议)的并发控制(如IBMDB2数据库),由于读、写均在记录的同一个版本上操作,因此排他锁等待队列后面的事务至少要阻塞到持锁者事务提交之后才能继续执行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容