zoukankan      html  css  js  c++  java
  • 三、1pc事务提交协议

    所有文章

    https://www.cnblogs.com/lay2017/p/12078232.html

    正文

    事务的基本概念一文中,我们知道了事务必须要满足ACID四个基本特性。如果你要让程序提供事务的特性,要满足ACID的特性,就得试着遵从一些规范。当然,如果有足够的能力,也可以自定义一些规范。

    本文将学习了解相对比较简单的一阶段(1pc)事务提交协议。

    1pc事务提交协议

    先来看一个序列图

    一阶段提交协议只有两部分

    1)开启一个事务

    2)正常commit事务,或者异常的时候rollback事务

    1pc的优点非常显而易见。非常的简单,只需要跟一个服务端交互,在交互上的损耗明显更少,所以性能上相对是很好的。

    而它的缺点也很明显。如果超过一个服务端的时候,它无法对多个服务端进行协调。所以使用场景就比较有限。

    这么一看,1pc提交协议是不是很像JDBC关于事务的接口设计呢?

    假设用1pc处理多个服务端?

    前面,我们说1pc比较适合单个服务端的情况。如果是多个服务端,那么1pc不能够协调多个服务端的事务。

    那么,我们假设1pc处理多个服务端会是怎么样?

    我们看到,活动图中开启了3个事务,如果一路commit成功,那么都没问题。

    如果其中一个失败,那么rollback当前事务,并需要人工干预之前提交过事务导致的数据不一致问题。

    当然,在某些场景下,我们也可以选择不断地重试commit,直到成功为止(比如mq,发送消息可以重复发送,消费消息维持幂等性即可。而且mq也很少出现commit失败的情况,即使有也相对容易恢复)。但在大多数场景下,1pc很明显不适合于多数据源。

    总结

    我们可以这么认为,如果只针对一个数据源,或者我们可以不断重试commit(维持最终一致性)的场景下我们选择1pc事务提交协议是一个简单高效的方案。

  • 相关阅读:
    《浏览器工作原理与实践》读书笔记(4)
    在django中使用原生sql语句
    异步任务 ---- django-celery
    vue上传视屏或者图片到七牛云
    django项目初始化
    mysql 更新并生成指定范围随机数
    opencv基本命令学习整理
    docker分配CPU、内存资源
    傅里叶分析
    websocket协议性能测试(jmeter版)
  • 原文地址:https://www.cnblogs.com/lay2017/p/12099510.html
Copyright © 2011-2022 走看看