首先说说什么是ACID:

它们分别是Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Transaction(持久性)

原子性:

意为单个事务里的多个操作要么一起成功,要么一起失败.比如现在有三个插入操作,那么前两个成功,第三个失败了,此时,前两个也不再算数,数据库会回滚到事务开始之前的状态.

innodb靠着undo缓冲区实现,也就是当事务开始的时候,首先将会受到影响的行当前的状态保存到undo缓冲区中,一旦失败,则回滚.

一致性:

单个事务对数据库的影响必须要保证是从一个状态到另一个状态的,这个怎么理解呢?将它理解为对原子性的补充就行了,也就是说,你一个事务里三个操作,如果其中一个失败了,其它的也不能对我的数据库造成影响,必须要三个一起成功才行.

这个的实现就是原子性的实现

隔离性:

这个是靠数据库锁实现的,数据库锁实在太繁杂,我这里就说说怎么mysql是怎么保证了在可重复读的情况下就避免了不可重复读和幻读吧.

首先,mysql的读操作在innodb下的读提交和可重复读的情况下都是使用了Mvcc,这个Mvcc将它理解为一个快照就可以了,而读已提交在一个事务里多次读的情况下,每次读都会读最新的已提交的数据.由此也就出现了幻读和不可重复读

比如A线程在一个事务里连续两次select

在第一次select后,B线程插入了一条数据,并且提交了事务.

此时A线程因为每次都是读最新的已提交的数据自然就读到了B线程插入的数据.

而在可重复读的情况下呢?

首先可重复读的情况下读Mvcc每次都是读第一次select的数据,由此就避免了可重复读和幻读的产生,因为B线程插入的数据对线程A的事务没有任何影响,但这样就代表没问题了吗?

假设这样一个场景,线程A要拿到当前最大的ID然后自增之后插入

假设现在数据库最大ID为10

线程A查询后,自增为11,并准备插入

但此时线程B插入一条数据,并且ID为11.

此时线程A插入,然后报错.

由此可见,此时还是会有问题.

那么怎么解决呢?很简单,使用select max(id) from table for update

因为在可重复读的情况下,使用排它锁,会默认升级为间隙排他锁,什么叫间隙排他锁呢?就是会锁离你最近的两个行数据,并且还有他们之间,不让别人进行增删改查操作,如果没有则取无限集.

那么此时,10右区间无限集就被锁起来了,线程B自然没法查询数据(当然也有可能是A,看谁先拿到锁).此时线程A就插入成功,然后B开始查询,之后插入(这里说下为什么是排他锁而不是共享锁呢?因为线程A和线程B在并发的情况下查了max(id)后,他们拿到的都是相同的数据,也就会在插入的时候报错,所以此时直接让他们其中一个堵在select那里,这样另一方拿到数据后,就会更新id,另一方也能拿到最新值了)

持久性:

  事务提交后,事务里的数据必须要进行刷盘,也就是强同步

  这里要插一句的是,当事务提交后,数据本身不会马上刷盘,而是由一个redo缓冲区保存了插入日志,进行刷盘,为什么要这样做呢?因为redo是日志数据,所以可以顺序写,而数据刷盘则是要找到文件里数据所在的索引,也就是随机写,而随机写比顺序写慢很多,毕竟多了硬盘寻址的操作.

纯干货,Mysql innodb的ACID特性是怎么实现的?以及高并发情况下会出现的问题的更多相关文章

  1. Mysql高并发情况下的解决方案(转)

    查询了下Mysql 关于高并发的处理的资料,在这记录一下. 高并发大多的瓶颈在后台数据逻辑处理,在存储,mysql的正常的优化方案如下: 1.代码中sql语句优化 2.数据库字段优化,索引优化 3.加 ...

  2. Mysql在高并发情况下,防止库存超卖而小于0的解决方案

    背景: 本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(<0),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没 ...

  3. 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...

  4. MySQL事务及ACID特性

    一.事物 1.定义:事务是访问和更新数据库的程序执行单元,事务中包含一条或者多条SQL语句,这些语句要么全部执行成功,要么都不执行. 在MySQL中,事务支持是在引擎层实现的,MySQL是一个支持多引 ...

  5. 一文说尽MySQL事务及ACID特性的实现原理

    MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...

  6. MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能

    MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 Clicks: Date: -- :: Power By 李轩Lane TagMysql计数器高性能 现在有很多的项目,对计数器的实现 ...

  7. 【转】记录PHP、MySQL在高并发场景下产生的一次事故

    看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且 ...

  8. 搞懂MySQL InnoDB事务ACID实现原理

    前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...

  9. [纯干货] MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. cocoapods学习

    1.安装 http://stackoverflow.com/questions/16459028/rvm-install-error-running-requirements-osx-port-ins ...

  2. Android计算器简单逻辑实现

    Android计算器简单逻辑实现 引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟 ...

  3. [洛谷P4556][BZOJ3307]雨天的尾巴-T3订正

    线段树合并+树上差分 题目链接(···) 「简单」「一般」——其实「一般」也只多一个离散化 考试时想法看>这里< 总思路:先存所有的操作,离散化,然后用树上差分解决修改,用权值线段树维护每 ...

  4. Linux命令基础操作--vim 归档 压缩 分区 格式化 挂载 Innode

    1 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 使用 cat命令将查看的文件合并输出到/1.txt 这里的关键:定位到文件,如果后面加上/后被认为是目录 分为两步,先 ...

  5. Codeforces Round #272 (Div. 2)-B. Dreamoon and WiFi

    http://codeforces.com/contest/476/problem/B B. Dreamoon and WiFi time limit per test 1 second memory ...

  6. github更换仓库

    1.找到.git目录   2.打开config文件 3.修改仓库地址 4.重新提交 git push --all origin 这样就替我们的项目换仓啦!!!^_^   分类: git 参考资料: h ...

  7. springboot-i18n国际化

    简介 In computing, internationalization and localization are means of adapting computer software to di ...

  8. 继上一篇随笔,优化3张以上图片轮播React组件

    import React from 'react'; import PropTypes from 'prop-types'; import {getSwipeWay} from '../utils/s ...

  9. (62)zabbix客户端自动注册

    1. 概述 上一篇内容<zabbix自动发现配置>,大概内容是zabbix server去扫描一个网段,把在线的主机添加到Host列表中. 我们本篇内容与上篇相反,这次是Active ag ...

  10. systemverilog之OOP

    what is oop terminology an example class default methods for classes static attibute assigment and c ...