其实最开始考虑分布式事务的问题是从接触ROCKETMQ开始,这是rocketMQ和kafka的主要区别,于是我一直想知道分布式事务怎么做,它的场景有哪些。

看来网红沈询老师的直播后,了解了一点点。

小结

  1. 单线程不存在竞争问题,所有操作同步执行,不影响事务的ACID属性。(排队法)
  2. 而多线程的出现解决了慢速设备带来的低延迟问题,线程之间通过os调度可以交替执行计算和IO操作,同时可以将低速的IO操作放在buffer里,聚集成批,减少IO操作的次数,异步执行。所以多线程是必须的。但是多线程带来的访问冲突问题,虽然一开始都会考虑加锁来解决,慢啊,面对不同的应用场景,还是应该采用不同的同步机制。
    1. 互斥锁,自旋锁,条件变量?
    2. 行锁,表锁,其实都是尽量减少锁的粒度
    3. 写时复制,增加版本号
    4. 避免冲突,做到无锁
  3. 从多线程,到多进程再到多机器,其实分布式事务比单机事务要难的多,因为有网络因素啊,网络是不可靠的,如何达到各机器的状态一致性就是一个很难的问题,即事务之前状态一致,事务执行完毕状态一致,在这个解决过程中,业界提出了很多算法,2pc,3pc,paxos等,但是根据分布式CAP理论,三个条件是不可以同时满足的。怎么折中就看架构师的选择了。

下面是直播内容。

事务简介

事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解。这种方式的优势是方便理解;它的劣势是性能比较低。

计算机可以简单的理解为一个标准的打字机,尽管看起来计算机可以并行处理很多事情,但实际上每个CPU单位时间内只能做一件事,要么读取数据、要么计算数据、要么写入数据,所有的任务都可以看成这三件事的集合。计算机的这种特性引出了一个问题:当多个人去读、算、写操作时,如果不加访问控制,系统势必会产生冲突。而事务相当于在读、算、写操作之外增加了同步的模块,进而保证只有一个线程进入事务当中,而其他线程不会进入。

单个事务单元

事务的四大特性分别是:原子型、一致性、隔离性和持久性。其中原子性指的是事务中包含的所有操作要么全做,要么全不做;一致性是指在事务开始以前,数据库处于一致性的状态,事务结束后,数据库也必须处于一致性的状态;隔离性要求系统必须保证事务不受其他并发执行的事务的影响;持久性是指一个事务一旦成功完成,它对数据库的改变必须是永久的,即使是在系统遇到故障的情况下也不会丢失,数据的重要性决定了事务的持久性的重要。

 

事务单元是通过Begin-Traction,然后Commit(Begin-Traction、Commit和Rollback之间所有针对数据的写入、读取的操作都应该添加同步访问),Begin和Commit之间就是一个同步的事务单元。例如,Bob给Smith 100块钱就是一个事务单元,这个过程中有很多步操作,具体如上图所示;但对业务来说,仅是一个转账的操作。

一组事务单元

当三个账户都在进行转账操作时,每个操作都涉及Smith账户,所有的事务都会排队,形成一组事务单元。

事务单元之间的Happen-Before关系中的四种可能性:读写、写读、读读、写写。所有事务之间的关系都可以抽象成这四种之一,来对应现在所有的业务逻辑处理。在此基础之上,需要用最快的速度处理多个事务单元之间的关系,同时还能保障这四种操作的逻辑顺序。

单个事务单元的其他例子

除了转账操作是事务单元外,诸如商品要建立一个基于GMT_Modified的索引、从数据库中读取一行记录、向数据库中写入一行记录,同时更新这行记录的所有索引、删除整张表等都是一个事务单元。

事务单元的实现方式

Two Phase Lock(2PL)是数据库中非常重要的一个概念。数据库操作Insert、Update、Delete都是先读再写的操作,例如Insert操作是先读取数据,读取之后判读数据是否存在,如果不存在,则写入该数据,如果数据存在,则返回错误。假设在该场景下没有读操作,只是单纯写入数据,则数据本身并没有事务操作,Delete、Update操作与之类似。数据库利用这些操作的特性,在每一次查询过程中,只要查到数据,就会在该数据上加锁。理论上,所有被读取的数据都已加锁,不会再被其他人读到,也就是说对数据进行的中间操作状态对所有人都不可见,当所有中间状态完成后,提交操作时,解开锁,此时数据对所有系统可见,例如在转账过程中,所有人只能看到两种状态:开始时,A有钱,B没钱;结束时,B有钱,A没钱,而中间A减掉钱,B尚未加上钱的状态被锁隐藏掉了,这个操作就是数据库中处理事务的最标准的方式。如上图所示:事务中的Trx2(JoeLock)与其他事务不相关,因此可以并行执行;Trx1需要Lock两个数据Boblock和Smithlock,而Trx3同样需要Lock这两个数据,因此Trx3必须等待,且等待在Boblock上;Joe事务会先结束,Trx3会等到Trx1完成后才会开始。

处理事务的常见方法

处理事务的常见方法有排队法、排他锁、读写锁、MVCC等方式,下面来一一解析。

排队法

事务处理中最重要也是最简单的方案是排队法,单线程地处理一堆数据。在Redis中,如果数据全部在内存中,则单线程处理所有Put、Get操作效率最高。这是因为多线程本质是CPU模拟多个线程,这种模拟是以上下文切换为代价,而对于内存的数据库来说,没有上下文切换时效率最高。因此,单个CPU绑定一块内存的数据,针对这块数据做多次读写操作时都是在单个CPU上完成的,单线程处理方式在内存的情况是效率是最优的。

那么什么时候事务需要用到多线程呢?这个问题的本质取决于下层所使用的存储,如果是内存操作,则可以动态地申请和销毁内存块;而磁盘的IOPS很低,但吞吐量很高。如果一个场景涉及多次读写操作,单线程可以很高的效率对于内存进行读写操作;但是,由于磁盘的IOPS仅为内存的几千分之一,如果依旧用操作内存的方式操作磁盘,那系统的整体性能将会很低,这意味着必须将大量的读写操作聚合成一个Batch后再提交时才能达到较好的性能。而将大量请求攒到一起的方式一是异步,也就是请求本身和线程不绑定,线程可以不Block(本质来说还是一种多线程的方式),处理完一个线程后再处理其他线程。这种做法的核心是将大量不同的请求提交到一个Buffer中,再由该Buffer统一读取或者写入磁盘,从而提高效率。在慢速设备中,多线程或异步非常常见,在设计系统时,面对磁盘、网络、SSD等慢速设备必须考虑使用多线程。

排他锁

有些场景不适合用单线程操作,可以利用排他锁的方式来快速隔离并发读写事务。数据库中有一些事务单元是共享的,如图中的事务单元1是共享的,事务单元2/3共享数据;针对事务单元2/3共享数据的所有读写Block住,事务单元1单独用一个锁来控制,用这种方式完成系统的访问控制。

读写锁

如果是一个只读的事务,例如只对数据进行查询操作,在该过程中数据一定不被修改,因此多个查询操作可以并行执行,因此一种针对读读场景的优化自然而然产生——读写锁。读写锁的核心是在多次读的操作中,同时允许多个读者来访问共享资源,提高并发性。

MVCC

在最初的数据库事务实现中是不存在MVCC的,它是Oracle在八十年代新加的功能,本质是Copy On Write,也就是每次写都是以重新开始一个新的版本的方式写入数据,因此,数据库中也就包含了之前的所有版本。在数据读的过程中,先申请一个版本号,如果该版本号小于正在写入的版本号,则数据一定可以查询到,无需等到新版本完全写完即可返回查询结果。这种方式可以在读读不阻塞的前提下,实现读写/写读不阻塞,尽可能保证所有的读操作并行,而写操作串行。

事务的调优原则

事务的调优的思路是在不影响业务应用的前提下:

第一,尽可能减少锁的覆盖范围,例如Myisam表锁到Innodb的行锁就是一个减少锁覆盖范围的过程;对于原位锁(排他锁、读写锁等)可变为MVCC多版本(本质仍然是减少锁的范围)。

第二,增加锁上可并行的线程数,例如读锁和写锁的分离,允许并行读取数据。

第三,选择正确锁类型,其中悲观锁适合并发争抢比较严重的场景;乐观锁适合并发争抢不太严重的场景。

阿里沈询直播 分布式事务一相关推荐

  1. 阿里沈询:分布式事务原理与实践

    直播回顾视频:https://yq.aliyun.com/edu/lesson/play/508 事务简介 事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解.这种方式的 ...

  2. 揭秘!阿里实时数仓分布式事务Scale Out设计

    简介: Hybrid Transaction Analytical Processing(HTAP) 是著名信息技术咨询与分析公司Gartner在2014年提出的一个新的数据库系统定义,特指一类兼具O ...

  3. ole db 访问接口 sqlncli 无法启动分布式事务_阿里终面:分布式事务原理

    本文提纲如下 前言 单数据源事务 & 多数据源事务 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交(3P ...

  4. 阿里终面:分布式事务原理

    本文提纲如下 前言 单数据源事务 & 多数据源事务 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交(3P ...

  5. GTS来了!阿里微服务架构下的分布式事务解决方案

    阿里妹导读:分布式事务已经成为微服务落地最大的阻碍,也是非常具有挑战性的一个技术难题. 为此,今天我们邀请阿里高级技术专家于皋,和大家深入探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿 ...

  6. Day124.分布式事务:Seata、2PC两段式、代码补偿TCC、本地消息表、MQ事物消息

    目录 一.相关概念回顾 二.分布式事务 三.分布式事务解决方案 1.基于XA协议的两段式提交(2PC)  - 强一致性 2.代码补偿事务(TCC) - 最终一致性 3.本地消息表(异步确保)- 最终一 ...

  7. 分布式事务及解决方案

    分布式事务 1 微服务化带来的分布式事务问题 开发当中真实场景: 首先,设想一个传统的单体应用(Monolithic App),通过 3 个 Module,在同一个数据源上更新数据来完成一项业务. 很 ...

  8. 面试官:聊一下分布式事务!

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5160 概要 在微 ...

  9. 分布式事务选型的取舍

    来自:DBAplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域. 微服务兴起的这几年涌现出不少分布式事务框架,比如ByteTCC ...

最新文章

  1. win7拒绝访问_win7系统提示无法访问application data如何解决
  2. Adobe Flex 3.0 和 AIR 1.0 正式发布
  3. Acwing第 26 场周赛【完结】
  4. TKinter的常用组件
  5. NCspider项目总结
  6. lucene索引word/pdf/html/txt文件及检索(搜索引擎)
  7. openwrt无盘服务器,搭建基于 OpenWrt/gPXE/iSCSI 的 Windows 无盘工作站
  8. Underscore.js (1.7.0)-函数预览
  9. sysbench数据库性能压测详解
  10. 洪水填充算法_区域填充算法和多边形填充的扫描线算法
  11. 怎么用sql按条件把表分离_在做sqlserver数据库sql优化时,这25条事项需要注意
  12. 烽火路由路虚拟服务器,netcore路由设置烽火
  13. QDateTime 和tm 的时间显示
  14. 注册一个域名需要多少钱_域名注册需要多少钱?注册一个域名一般要多少钱?贵吗?...
  15. diy 单片机 自动浇花_基于单片机的自动浇花器设计
  16. 分享一个普通程序员的“沪漂”六年的历程以及感想
  17. qbittorrent 等待_qBittorrent下载BT电影教程
  18. 淘宝网 286亿海量图片存储与处理架构
  19. 恶意代码机理与防护笔记
  20. linux查看内存条ddr3和ddr4,怎么区分DDR3和DDR4内存条

热门文章

  1. 重磅!详解阿里研究院互联网+报告
  2. 猫眼盯上KOL,娱乐营销得靠网红了?
  3. centos7 磁盘分区
  4. 梯度反向传播(CS231n课程笔记翻译)
  5. 120年奥运会数据分析
  6. c语言中不定积分如何编写程序,谁能举个例子教我一下C语言的定积分运算
  7. 真神器!让你快速在VirtualBox上快速安装苹果操作系统
  8. LambdaStream
  9. 计算机新技术在体育中的应用,应用计算机技术在现代体育领域中的运用
  10. 如何对付臭名昭著的 IO 夯?诊断利器来了