首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql分布式事务,undo和redo,java学习这块必须要懂?

01

1.什么是分布式事务

要了解分布式事务,必须先了解本地事务。

1.1.本地事务

本地事务,是指传统的单机数据库事务,必须具备ACID原则:

原子性

所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。

一致性

事务的执行必须保证系统的一致性,在事务开始之前和事务结束以后,数据库的完整性没有被破坏,就拿转账为例,A有500元,B有500元,如果在一个事务里A成功转给B50元,那么不管发生什么,那么最后A账户和B账户的数据之和必须是1000元。

隔离性

所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。数据库保证隔离性包括四种不同的隔离级别:

Read Uncommitted(读取未提交内容)

Read Committed(读取提交内容)

Repeatable Read(可重读)

Serializable(可串行化)

-持久性

所谓的持久性,就是说一旦事务提交了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。

因为在传统项目中,项目部署基本是单点式:即单个服务器和单个数据库。这种情况下,数据库本身的事务机制就能保证ACID的原则,这样的事务就是本地事务。

概括来讲,单个服务与单个数据库的架构中,产生的事务都是本地事务。

其中原子性和持久性就要靠undo和redo 日志来实现。

02

undo和redo

在数据库系统中,既有存放数据的文件,也有存放日志的文件。日志在内存中也是有缓存Log buffer,也有磁盘文件log file。

MySQL中的日志文件,有这么两种与事务有关:undo日志与redo日志。

1.2.1.undo日志

数据库事务具备原子性(**Atomicity**),如果事务执行失败,需要把数据回滚。

事务同时还具备持久性**(Durability)**,事务对数据所做的变更就完全保存在了数据库,不能因为故障而丢失。

原子性可以利用undo日志来实现。

Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到Undo Log。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。

数据库写入数据到磁盘之前,会把**数据先缓存在内存**中,事务提交时才会写入磁盘中。

用Undo Log实现原子性和持久化的事务的简化过程:

假设有A、B两个数据,值分别为1,2。

A. 事务开始.

B. 记录A=1到undo log.

C. 修改A=3.

D. 记录B=2到undo log.

E. 修改B=4.

F. 将undo log写到磁盘。

G. 将数据写到磁盘。

H. 事务提交

如何保证持久性?

事务提交前,会把修改数据到磁盘前,也就是说只要事务提交了,数据肯定持久化了。

如何保证原子性?

- 每次对数据库修改,都会把修改前数据记录在undo log,那么需要回滚时,可以读取undo log,恢复数据。

- 若系统在G和H之间崩溃

此时事务并未提交,需要回滚。而undo log已经被持久化,可以根据undo log来恢复数据

- 若系统在G之前崩溃

此时数据并未持久化到硬盘,依然保持在事务之前的状态

缺陷:每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。

如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一种机制来实现持久化,即**Redo Log**.

1.2.2.redo日志

和Undo Log相反,Redo Log记录的是**新数据**的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化,减少了IO的次数。

先来看下基本原理:

Undo + Redo事务的简化过程

假设有A、B两个数据,值分别为1,2

A. 事务开始.

B. 记录A=1到undo log buffer.

C. 修改A=3.

D. 记录A=3到redo log buffer.

E. 记录B=2到undo log buffer.

F. 修改B=4.

G. 记录B=4到redo log buffer.

H. 将undo log写入磁盘

I. 将redo log写入磁盘

J. 事务提交

03

安全和性能问题

如何保证原子性?

如果在事务提交前故障,通过undo log日志恢复数据。如果undo log都还没写入,那么数据就尚未持久化,无需回滚

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200719A0D7JC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券