MySQL探秘(八):InnoDB的事务

 事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个基本特性如数家珍。但是聊起事务或者ACID的底层实现原理,往往言之不详,不明所以。所以,今天我们就一起来分析和探讨InnoDB的事务机制,希望能建立起对事务底层实现原理的具体了解。

事务的四大特性

 数据库事务具有ACID四大特性。ACID是以下4个词的缩写:

  • 原子性(atomicity) :事务最小工作单元,要么全成功,要么全失败 。
Read More
Share

MySQL探秘(六):InnoDB一致性非锁定读

 一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB会去读取行的一个快照。

一致性非锁定读示意图

 上图直观地展现了InnoDB一致性非锁定读的机制。之所以称其为非锁定读,是因为不需要等待行上排他锁的释放。快照数据是指该行的之前版本的数据,每行记录可能有多个版本,一般称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制(Multi Version Concurrency Control, MVVC)。InnoDB是通过undo log来实现MVVC。undo log本身用来在事务中回滚数据,因此快照数据本身是没有额外开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。

 一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。但是并不是在每个事务隔离级别下都是采用此种方式。此外,即使都是使用一致性非锁定读,但是对于快照数据的定义也各不相同。

 在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。然而,对于快照数据的定义却不同。在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

Read More
Share

2018年,计划目录

 和17年计划一样,建立一个计划目录,记录一下18年的计划和实现情况,进行不定时的更新。

计划列表

工作

  • 测试用例自动化生成技术研究

    生活

    书籍

  • 计算机程序的构造和解释

    更新

    2018.3.26日

    测试用例自动化生成技术研究

     依据代码逻辑自动生成junit代码。用于追求覆盖率的junit代码自动生成

    计算机程序的构造和解释

     再次挑战这本书,希望能坚持下去。

Read More
Share

Spring Cloud Stream(一):Spring基础知识

 我研究和阅读Spring Cloud Stream源码已经有一个多月了,但是由于自己的Spring基础知识不是很充足,所以导致很多地方都没有融会贯通,并且相关的文章一直无从下手。于是我先整理了当时阅读代码时的知识点记录,算是源码分析之前的基础知识储备吧,整理的有些杂乱,希望大家理解。
 本文涉及的Spring知识如下:

  • Spring Boot的@Import用法和原理,与ConfigurationImportBeanDefinitionRegistrar相关
  • Bean初始化各个周期的回调,比如InitializingBean,BeanPostProcessor,SmartInitializingSingleton
  • FactoryBeanMethodInterceptor
Read More
Share

Spring Boot (一): Spring Boot starter自定义

 前些日子在公司接触了spring bootspring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用。但是由于其自动化配置的原因,往往导致出现问题,新手无法快速定位问题。这里我就来总结一下spring boot 自定义starter的过程,相信大家看完这篇文章之后,能够对spring boot starter的运行原理有了基本的认识。
 为了节约你的时间,本篇文章的主要内容有:

  • spring boot starter的自定义
  • spring boot auto-configuration的两种方式,spring.factories和注解
  • Conditional注解的使用
Read More
Share

Raft算法

 前段时间一直在学习mit的分布式课程Distributed Systems,仔细阅读了raft论文,但是中间又跑去搞docker了,所以一直没有整理raft相关的文章,今天就来总结一下。
 文章中没有多少详细的图片,但是大家可以边看文章边看Raft演示动画
 之前介绍的Paxos算法一直都是分布式一致性协议的标准,但是Paxos难以理解,更难以理解。于是Stanford的教授提出了Raft协议,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性。这里有Raft的论文,大家有兴趣可以自行阅读一下。
 Raft是为了managing a replicated log。Raft会首先选举一个leader,然后让这个leader来管理replicated log。Raft将consensus问题(也就是一致性问题)划分成三个相互独立的子问题:

  • leader election
  • log replication
  • safety
Read More
Share

Kubernetes部署

 学习完Docker之后,发现了kubernetes这个容器云框架,于是就自己部署来玩玩。大家也可以按照这个和我一步步部署 kubernetes 集群文章来部署。最近在这里花费了大量的时间,之后希望整理一下相关的原理介绍。

kuber1.png

kube3.png

问题列表和解决方案

Read More
Share

Docker系列之Jenkins自动化部署

 Devops的概念已经火了很久了,我一直想对这方面进行一定的了解;再加上实验室项目环境依赖比较复杂,希望使用Docker来解决,所以最近就好好研究了一波Docker的相关实践和原理。这里整理一下,希望组成一个系列,从实践到原理详细讲解一下Docker的使用。
 第一篇就讲一下Jenkins+Docker的自动化部署实践。大致的流程如下:目前我有两个服务器,分别是阿里云和bandwagon,代码存储在github上,每次push都会触发阿里云上的jenkins的构建任务,jenkins将github上的代码fetch到本地,编译打包成war文件,生成docker image并上传到docker registry上,然后通过ssh来登录bandwagon服务器pull下来新生成的image并启动。由于篇幅问题,本篇文章不会介绍有关docker image的build和docker registry的搭建,但是我会在后续文章中再做详细讲解。
 学习Docker,我推荐先在网络上找说明指南,一步一步自己尝试的使用,然后如果觉得有必要可以看一下《Docker容器和容器云》这本书。
 本文内容都是docker和jenkins的基础知识,为了节约你的时间,本文的主要内容如下:

  • docker 基础命令
  • jenkins docker版本的搭建,构建任务的配置
  • Pubish Over SSH 安装和配置
Read More
Share

《多处理器编程艺术》-链表:锁的作用

 最近在阅读《多处理器编程艺术》一书,掌握了很多Java多线程的底层知识,现在就做一下书中链表-锁的作用一章的总结。
 为了节约你的时间,本文主要内容如下:

  • 带锁的链表队列
  • 细粒度同步
  • 乐观同步
Read More
Share

2017年,计划目录

 和16年计划一样,建立一个计划目录,记录一下17年的计划和实现情况,进行不定时的更新。

计划清单

英语学习

单词量

  • 口语小助手 2017.1.30~

口语

Read More
Share