mysql

  MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

mysql结构

    

    如上图所示,可分为用户连接线程 -> 服务层 -> 存储引擎

    用户连接线程:处理客户端连接、授权、用户认证等。

    服务层:处理sql语句的解析、缓存的处理和函数的实现等

    存储引擎:对于数据的存储和提取(innodb、NDB Cluster支持事务,Mylsam、Memory不支持事务)。

    如无特殊说明,后文中描述的内容都是基于InnoDB。

 ACID事务特性

  mysql由start transaction标识事务的开启,commit提交事务,rollback回滚事务,mysql在默认情况下开启事务,即autocommit模式,在这种模式下,每一个sql语句都会被当成一个事务执行提交操作。当然也可以将autocommit的开关关上,需要注意的事,autocommit参数针对的事连接,修改参数只会对当前连接生效,如需全局修改,请修改启动配置文件。

    mysql当中,当执行一些特殊的语句的会后,会强制事务的提交,比如DDL语句(create table/drop table/alter/table),常用的增删改查操作都不会强制提交事务

  •   原子性(Atomicity)

      原子性是指一个事务不可分割的一个工作单位,要么都成功,要么都失败。针对单个事务而言

      实现原理:undo log(回滚日志,由存储引擎实现)

        当事务对数据库进行修改时,innodb会生成对应的undo log记录,记录sql执行相关信息。当事务失败调用rollback回滚时,会根据undolog中的信息进行反向操作,将数据回滚到事务开启之前的状态。

  •    一致性(Consistency)

    一致性指的是事务执行前后数据的完整性没有被破坏,包括实体完整性(如行的主键存在且唯一)、列完整性(如字段的类型、大小、长度要符合要求)、外键约束、用户自定义完整性(如转账前后,两个账户余额的和应该不变)等等。

    一致性是事务的终极目标,其他三个特性都是为一致性所服务的

    数据库实现一致性的措施体现:

      不允许向整形列插入字符串值、字符串长度不能超过列的限制等

  •   隔离性(Isolation)

     隔离性指的是多个事务同时执行的时候,每个事务内部都应该与其他事务是隔离的,不能互相干扰。

       数据库的隔离级别:读未提交(RU)、读已提交(RC)、可重复读(RR)、序列化也叫串行化(S)

     实现原理:读读之间(MVCC多版本并发控制协议)、读写之间(锁机制)

      1、MVCC:MVCC是一种乐观锁的体现,主要是通过两个隐藏列实现(事务版本号和undolog指针,也是undolog版本链),用户在某一时刻对整个事务系统进行快照,之后再进行读操作时,会将读取到的事务中的事务版本号和快照比较,从而判断数据对该快照是否可见,即对打快照时的事务是否可见。RR隔离级别下,事务在事务开始的时候进行快照动作,一直到事务提交都不会重新进行快照。RC则是每次select操作之前会重新建立快照,这就导致RC可能会在第二次select的时候读到其他事务提交得数据,所以RC情况下可以避免脏读问题可是无法避免重复读和幻读问题。

     2、锁机制:mysql锁可以分为共享锁(lock in share mode)、排它锁(for update)、意向锁(意向共享和意向排他)、间隙锁(Gap lock),共享锁、排它锁是行锁,锁粒度小,性能好,意向锁是表锁,是数据库自身的行为,不需要人工干预,在事务结束后会自行解除,多用在innodb当中,意向锁主要解决事务开始时遍历所有行的锁持有情况从而导致性能较低的问题,事务在检查行锁之前会检查意向锁是否存在,存在则阻塞线程.

    意向锁协议: 

    •   事务要获取表A某些行的S锁必须要获取表A的IS锁(意向共享锁)
    •   事务要获取表A某些行的X锁必须要获取表A的IX锁(意向排他锁)

    间隙锁:

      innodb下间隙锁的产生需要产生三个条件:

        1、隔离级别为RR(mysql默认,不改即为这个)

        2、当前读(非快照读)

        3、查询条件能够走索引(这里提一句:mysql行锁(间隙锁也是行锁)锁的是索引,所以当查询未使用索引的情况下,innodb会使用表锁,这就会导致一些使用相同索引键的查询也会出现锁冲突)

      注意:innodb使用一个相等条件请求对一个不存在的记录加锁的时候,也会产生间隙锁

      间隙锁的作用:

        当前读幻读的解决方法:间隙锁可以锁定一个范围内的多条数据,防止事务执行的时候其他事务往这个范围内插入数据,导致幻读,这是主要目的。

      

  • 持久性(Durability)

    持久性指的是事务一单提交,它对数据库产生的改变应该是持久的(单个事务而言).

    实现原理:redo log(重做日志,存储引擎实现)

      在innodb当中,数据是存放在磁盘上的,但是如果每次查询数据都需要读磁盘的话,效率会相当低。为此,innodb提供了一个缓存机制--Buffer Pool(简称BP),BP中包含了磁盘中部分数据的映射,作为访问数据库的缓存。

        当读数据的时候,先读BP,BP没有在读磁盘,然后将数据放入BP。

        当写数据的时候,先写BP,BP会将数据定期刷新到磁盘当中(刷脏)。

      上面写数据就会产生一个问题,当我们的机子死机了,BP数据还未刷到磁盘中那数据不就丢失啦?事务的持久性就得不到保证

      为了解决这个问题:redo log 引入解决这个问题:

        当数据修改时,会先记录在redo log 中。然后再写入BP中,当事务提交的时候,就会调用fsync接口对redolog进行刷盘(落磁盘),如果mysql宕机,就可以在重启的时候读取redolog的日志恢复数据库中的数据.

        既然redolog也要进行磁盘IO,为什么比BP快呢?

        两个原因:

          1、BP是随机IO,每次修改的位置随机,redoLog属于追加操作,顺序IO.

          2、BP是以页(Page)为单位进行磁盘操作的,但是redolog只是做真正需要写入的部分,相对BP来讲,会少很多无效的IO.

 

 最后提一嘴binog和redo log的区别:

    1、redo log存储引擎实现、binlog服务层实现(可参照第一张图,不太擅长画图,sorry……)

    2、redo log写入的时机比较多,各种修改都会触发,只是在事务提交的时候落磁盘而已。binlog则只会在事务提交的时候写入。

    3、binlog为二进制日志,根据参数不同可能是sql或者数据。redolog则是物理日志,内容基于Page。

第一次写一篇比较完整的博客,完全根据自己的想法走,要是哪个位置写的不太对,欢迎大家一起探讨提高,感谢每一个路过的人。  

mysql浅谈--事务ACID特性的更多相关文章

  1. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  2. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  3. 事务ACID特性,其中I代表隔离性(Isolation)。

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  4. 数据库事务ACID特性及隔离级别

    数据库ACID特性介绍 1.原子性(Atomic)一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性,要支持回 ...

  5. 【MySQL】:事务四大特性与隔离级别

    目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...

  6. 事务ACID特性

    所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行. 数据库事务必须具备 ...

  7. 数据库事务ACID特性(原子性、一致性、隔离性、持久性)

    ACID特性: 原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability) 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个 ...

  8. 事务一致性理解 事务ACID特性的完全解答

    A  原子性 事务管理者多个小操作,他们同时完成或者同时不完成就是原子性 C 一致性 一致性,是一个很相对的,很主观的概念, 一致性 描述的是 事务 从一个一致的状态变成 另一个一致的状态. 一致性需 ...

  9. 浅谈Java三大特性之封装

    目录 前言 好处 介绍(实现方式) 示例 小结 感谢阅读!!! 三大特性之浅谈封装 前言 英语:Encapsulation--封装,包装. 面向对象的封装与真实世界的目的是一样的.封装能够使外部访问者 ...

随机推荐

  1. 每日一道 LeetCode (19):合并两个有序数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  2. C#分布式登录——jwt

    一.传统的session登录 在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这 ...

  3. three.js 制作逻辑转体游戏(上)

    今天郭先生又出来制作游戏了,最近有小伙伴要做一个逻辑转体小游戏,我怎么能不先来试试呢.玩法可以看上面的连接,下面附几张图.线案例请点击博客原文. 游戏规则不懂得可以看自行百度哈,其实玩起来还挺有难度的 ...

  4. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  5. 浅谈AutoML

    Auto ML的概念很广很深,本篇文章旨在概念上的一些理解.   我们之前谈过一个模型从幕后走向台前是有很多的工作要做的,AutoML的最初目标正如其名字是想自动化这个过程.实际上有很多人讨论到Aut ...

  6. 牛客网PAT练兵场-科学计数法

    题目地址:https://www.nowcoder.com/pat/6/problem/4050 题解:模拟题 /** * Copyright(c) * All rights reserved. * ...

  7. 区块链入门到实战(19)之以太坊(Ethereum) – 以太币

    以太币的作用:防范以太坊网络被滥用和激励矿工. 与比特币网络有比特币类似,以太坊(Ethereum)也有自己的虚拟币 — 以太币. 以太币的主要作用有2个: 应用程序执行任何操作都需要支付以太币,防范 ...

  8. Java并发必知必会第三弹:用积木讲解ABA原理

    Java并发必知必会第三弹:用积木讲解ABA原理 可落地的 Spring Cloud项目:PassJava 本篇主要内容如下 一.背景 上一节我们讲了程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单? ...

  9. SpringBoot使用简单缓存

    第一步开启缓存(只要是springboot项目就可以)  数据库连接等相关配置请读者自行实现. 在Application启动类上添加注解 @EnableCaching 开启缓存 @SpringBoot ...

  10. 程序员软件开发最好的IDE集成工具eclipse各个版本的详细介绍。详细介绍,送给初学者的朋友

    对于刚接触软件开发的初学者,在下载eclipse时,对官网上面提供的各种版本的选择犹豫不决.下面将对常用的几个版本进行介绍. Eclipse版本 Eclipse Standard 该版本是eclips ...