数据库——事务&分布式

事务的概念


事务,我的理解就是一个完整的事件,它可能由许多小的操作组成。比如select选取数据,是事务,select之后继续drop数据二者结合起来也算是一个事务。

事务的特性(ACID)

  • 原子性:事务是一个包含一系列操作的原子操作。事务的原子性确保这些操作全部完成或者全部失败。
  • 一致性:一旦事务的所有操作结束,事务就被提交。然后你的数据和资源将处于遵循业务规则的一直状态。
  • 隔离性:因为同时在相同数据集上可能有许多事务处理,每个事务应该与其他事务隔离,避免数据破坏。
  • 持久性:一旦事务完成,他的结果应该能够承受任何系统错误(想象一下在事务提交过程中机器的电源被切断的情况)。通常,事务的结果被写入持续性存储。

我的理解是:

  • 原子性就是,这个事务要么成功、要么失败。失败则不会让原系统(数据)产生任何变化。
  • 一致性,是要满足一些规则的约束,这些规则是人定的,是业务要求。比如转账,有人转出1块,就必须有人收到1块。
  • 隔离性主要体现在并发操作,如a写b读,此时b可能读到旧的脏数据。
  • 持久性,如何实现呢?一般是通过日志来实现的,比如写之前,数据库会先写接下来要执行的操作,如果执行过程断电了。则根据日志来重复操作。

分布式的系统


CAP理论:

即一致性、可用性、分区容错。

  • 所谓一致性,就是无论何时,读取的分布式各服务器上的数据都是相同的。比如a主机写了一个数据M,b主机此时就被锁定了,直到b主机更新了M之后才能被读取。
  • 所谓可用性,就是无论何时,访问哪个服务器总能得到数据(除非服务器死机)。
  • 所谓分区容忍性,分布式系统中,节点之间可能出现不连通的情况,导致网络分成了几块。如果只把数据放到一个节点中,那么出现不连通后,其他节点就访问不到数据了,这就是分区不容忍。反之,每个节点都存储一份数据,这叫做分区容忍。同时也带来一致性的问题。

这三个中,只能同时保证两个。且分区容错是必须要保证的,因为无法保证一定能够通信成功。

一致性与可用性的矛盾:

对于a、b两个服务器,如果a更新了数据data1,b此时未更新。如果要保证一致性,那么b只有更新data1后才能被访问,这就损害了可用性。如果保证可用性,那么此时a、b的数据并不一致。

BASE理论:

即基本可用、柔性状态、最终一致。这里引用@新栋BOOK的总结,https://www.jianshu.com/p/ab1a1c6b08a1

  • 基本可用:分布式系统出现故障的时候,允许损失一部分可用性。比如,京东618大促的时候,对一些非核心链路的功能进行降级处理。
  • 柔性状态:允许系统存在中间状态,这个中间状态又不会影响系统整体可用性。比如,数据库读写分离,写库同步到读库(主库同步到从库)会有一个延时,这样实际是一种柔性状态。
  • 最终一致性:那上面数据库主从复制的例子,经过数据同步延时之后,最终数据能达到一致。

柔性事务针对分布式事务的解决方法:

  • 记录日志+补偿:记录事务的开始和结束状态。事务根据日志记录找回事务的当前执行状态,并根据状态决定重试异常步骤,也就是正向补偿,或者回滚上一次执行步骤,也就是反向补偿。
  • 消息多次重试:也就是发送多次消息,由于要多次重发,所以程序必须是幂等(同一操作反复执行多次结果不变),这是非常具有互联网特征的一种模式。
  • “无锁”设计:放弃锁是一个解决问题的思路。比如通过乐观锁,大多数是基于版本号来实现。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值