第二章 分布式事务实战笔记

一、事务基本概念

1什么是事务? 

事务是恢复和并发控制的基本单位,事务有四个特性(ACID),原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。

2、事务经典场景 

假设这样一个场景: A给B转账100,流程步骤如下:

第一步:A减100,第二步:B多100。

如果第一步骤执行后,系统崩溃掉了,会怎么样呢?

问题:A被减掉了100,但B的钱未能加100. 此时,A + B的金钱总额凭空少了100,数据不一致了。

解决思路?

我们希望步骤1和步骤2能够绑定在一起执行,不可分;并且在步骤1和步骤 2执行的过程中,尽量规避中间状态,即谓事务。事务在解决上述问题中,提出了以下四种特性ACID。

1、原子性

原子性就是不可拆分的特性,要么全部成功然后提交(commit),要么全部失败然后回滚(rollback)。若开启事务,在上述场景就不会出现A少100成功,B多100失败这种情况。

MySQL通过Redo Log重做日志实现了原子性,在将执行SQL语句时,会先写入redo log buffer,再执行 SQL 语句,若 SQL 语句执行出错就会根据 redo log buffer 中的记录来执行回滚操作,由此拥有原子性。

2一致性

一致性指事务将数据库从一种状态转变为下一种一致的状态。比如有一个字段name有唯一索引约束,那么在事务前后都不能有重复的name出现违反唯一索引约束,否则回滚。

在上述场景中即金钱总数总是200,不能凭空增加减少,MySQL通过undo Log实现一致性,执行SQL语句时,会先写入undo log再写入redo log buffer。undo是逻辑日志,会根据之前的SQL语句进行相应回滚,比如之前是insert那么回滚时会执行一个delete,一个update会执行一个相反的update。并且除了回滚,undo log还有一个作用是MVCC,当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可通过undo读取之前的行版本信息,实现非锁定读取。并且undo log也会产生redo log,因为undo log也需要持久性的保护。

3、隔离性

首先介绍如果没有隔离性会发生的4种情况:

3.1、丢失更新

A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来,MySQL通过三级封锁协议的第一级解决了丢失更新,事务T要修改数据A时必须加X锁,直到T结束才释放锁。

3.2、脏读

脏读主要是读取到了其他事务的数据,而其他事务随后发生回滚。MySQL通过三级封锁 协议的第二级解决了脏读,在一级的基础上,要求读取数据A时必须加S锁,读取完马上释放S锁。

3.3、不可重复读

不可重复读是读取到数据后,随后其他事务对数据发生了修改,无法再次读取。MySQL通过三级封锁协议的第三级解决了不可重复读。在二级的基础上,要求读取数据A时必须加S锁,直到事务结束了才能释放S锁。

3.4、幻读

幻读是读取到数据后,随后其他事务对数据发生了新增,无法再次读取。在InnoDB引擎Repeatable Read的隔离级别下,MySQL通过Next-Key Lock以及MVCC解决了幻读,事务中分为当前读以及快照读

4、持久性

一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。具体实现原理就是在事务commit之前会将,redo log buffer中的数据持久化到硬盘中的redo log file,这样在commit的时候,硬盘中已经有了我们修改或新增的数据,由此做到持久化。

二、事务原理与锁

1、锁的问题场景

多对一问题,多个操作者同时操作一个资源,而资源的状态变化是非原子的(有中间态),哄抢会导致资源状态混乱。

 

2、事务的问题场景

一对多的问题,一个操作者需要绑定操作一系列资源(比如多条sql),若任何一条操作失败,都会导致整个操作失去意义。

 

3、事务的实现(了解即可)

3.1redo log

redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值