网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

数据库工作负载:

数据库工作负载有主要分为两种:

       在线事务处理(OLTP):每次只读取或更新数据库的一小部分,比如说用户去淘宝购物,用户只能对自己的购物车或者地址进行操作,这些操作只会涉及到很小的一部分数据。

       在线分析处理(OLAP):和OLTP不同的是,OLAP会对数据库的大量数据进行操作,例如进行连接或聚合运算,比如说淘宝会对大量的用户数据进行分析,来帮助淘宝进行商业决策,更好的为用户服务。

       近几年出现了混合事务+分析处理(HATP)的数据库,在HATP数据库中既可以进行OLTP操作,又可以进行OLAP操作,避免了资源的浪费。

       如下图所示是常见的企业配置数据库的方式,公司用前端的OLTP数据库来进行事务处理,一个公司可以有好几个OLTP数据库。当公司想要对这几个OLTP数据库内的数据进行分析的时候,公司需要把数据从OLTP数据库拿出来,进行提取转换加载(ETL)操作,该操作会对数据进行清洗以及转换,把数据格式统一起来加载到后端的OLAP数据库中。然后在OLAP数据库中进行分析操作,必要的时候OLAP数据库还会给OLTP数据库返回计算的结果。

01.png


       以淘宝为例,淘宝在前端用OLTP收集用户的物品点击信息,在后端OLAP数据库中计算用户可能感兴趣的物品,将这个物品返回给前端OLTP数据库,以便用户下次访问的时候将这个物品呈现给用户。

       HTAP数据库允许了某些只能运行在后端OLAP数据库的操作运行在前端OLTP数据库中,减少了数据从

OLTP DB --> ETL --> OLAP DB --> OLTP DB

之间传输的时间,但是HTAP不能取代ETL。


数据库事务(Transaction简称为Txn) Model:

       Transaction是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。—维基百科

       数据库事务模型主要有六种,分别是:Flat Txns,Flat Txns+ Savepoints,Nested Txns,Chained Txns,Compensating Txns,Saga Txns,以下对这些模型进行具体介绍。


Flat Txns:

       我们现在所说的transaction大多指的是Flat Txns。Flat Txns以BEGIN开头,后面跟着一系列操作,最后以COMMIT或者ROLLBACK结束。

       如下图所示,Txn #1以BEGIN开头,紧接着对A进行读取,对B进行写操作,最后COMMIT,表明B被永久写入数据库中了, Txn #2在对B进行写操作之后ROLLBACK,表明对B的写操作会回滚,B不会被写入数据库中。

02.png


       Flat Txns的缺点:当数据库需要rollback的时候,需要rollback这个transaction的所有操作。当数据库在进行transaction的时候崩溃了,所有对数据库的写操作都会丢失。比如说银行需要对大量用户数据进行更新,使用FLAT Txns会花费大量的时间更新数据,若这时数据库崩溃或冲突所有操作都会丢失。


Flat Txns+ Savepoints:

       为了解决Flat Txns的这个缺点,我们可以给DB加savepoint,savepoint保存了transaction当前的状态,允许用户访问这个状态。用户可以用ROLLBACK命令回滚到某个savepoint,用RELEASE来摧毁某个savepoint。

       如下图所示,Txn #1在BEGIN语句执行时候自动生成一个new savepoint,然后对这个savepoint写入A。

03.png


       

       在执行命令savepoint 1的时候将new savepoint重命名为savepoint 1。然后生成一个新的savepoint:new savepoint用来保存之后的操作。

04.png


       在运行WRITE(B) 的时候将B写入new savepoint中。当执行ROLLBACK To 1的时候,会把刚刚创建的savepoint删掉,重新建立一个new savepoint用来保存之后需要写入的C。所以当最后COMMIT的时候A和C会写入数据库中,B不会。

05.png


Nested Txns:

       Nested Txns是在进行transaction的时候调用了其他transaction,子transaction的结果取决于父transaction。我们用下面这个例子看一下。

06.png


       如上图所示,Txn #1在执行的时候调用了Sub-Txn #1.1,然后Sub-Txn #1.1又调用了Sub-Txn #1.1.1。因为在Sub-Txn #1.1最末尾进行了ROLLBACK,所以Sub-Txn #1.1.1和Sub-Txn #1.1的所有操作都无效。因此当Txn #1 COMMIT的时候只有A会被写入数据库中。

07.png


Chained Txns:

       Chained Txns是一个接一个的连续执行多个transactions,这些transactions之间的COMMIT和BEGIN操作是原子性的(atomic)。 与savepoint不同的是,在一个transaction COMMIT之后数据库可以释放这个transaction的锁,并且transaction COMMIT后不能ROLLBACK。

       如下图所示,Txn #1在执行COMMIT命令后将A写入数据库中,Txn #2在执行COMMIT命令后将B写入数据库中,Txn #3在进行WRITE( C) 操作后,即使进行了ROLLBACK也只对C有效,A和B不受影响。

08.png


       若想逆转已经COMMIT的transaction的结果,我们需要Compensating Txn。


Compensating Txns:

       Compensating Txns具有以逆转已经COMMIT的transaction的功能。把Chained Txns和Compensating Txns加在一起,就是Saga Txns。


Saga Txns:

Saga Txns由一系列Chained Txns T1−Tn和Compensating Txns C1−Cn−1组成。这些transaction将会以 T1,...Tj,Cj...C1 T_1,. . . T_j,C_j. . .C_1T 1 ,...Tj,C j...C 1(其中j < n$)的顺序进行COMMIT。Saga Txns允许数据库支持长时间运行的,多步的transaction。

       如下图所示,假设Txn #1,Txn #2,Txn #3是Chained Txns,在运行Txn #3的时候程序中断,若此时什么都不处理则Txn #1和 Txn #2的的产物A + 1和B + 1仍然会被写入数据库中。


09.png


       Saga Txns会继续运行Compensating Txns,从后往前逆转已经COMMIT的transactions的操作。

10.png


       目前没有数据库内在支持Chained Txns和Saga Txns,支持他们的大多是编程框架,特别是微服务(micro services)。因为微服务每次通常只会更新很小的数据,通过使用Saga Txns我们可以安全的对大量的微服务进行更新。

评论 0

暂无评论
0
0
0
立即
投稿
发表
评论
返回
顶部