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. WKWebView 网络请求Header 丢失

    WKWebView 是苹果手机上主要的H5加载控件,它相比UIWebView 有诸多优势.在次不做比较,但是它的坑缺比较多.网上也有很多的例子但是做的比较好的真不多,我在这里推荐俩博客供大家参考.ht ...

  2. 准确率99.9%的离线IP地址定位库

    Ip2region是什么? ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nod ...

  3. 反制面试官 | 14张原理图 | 再也不怕被问 volatile!

    反制面试官 | 14张原理图 | 再也不怕被问 volatile! 悟空 爱学习的程序猿,自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCl ...

  4. 使用MSF通过MS17-010获取系统权限

    ---恢复内容开始--- Step1:开启postgresql数据库: /etc/init.d/postgresql start Step2:进入MSF中,搜索cve17-010相关的exp: sea ...

  5. Centos7第一安装后无法联网

  6. Nginx和FastDfs完整配置过程

    借鉴(https://blog.csdn.net/qq_34301871/article/details/80060235) 1.unknown directive "ngx_fastdfs ...

  7. python基础 Day11

    python Day11 函数中默认参数的陷阱 只针对默认参数是可变的数据类型(如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次默认参数,都是同一个) def test(name,list ...

  8. Solon详解(六)- 定制业务级别的验证注解

    在业务的实现过程中,尤其是对外接口开发,我们需要对请求进行大量的验证并返回错误状态码和描述.lombok 框架有很多很赞的注解,但是人家是throw一个异常,这与有些需求不一定能匹配. 该文将基于So ...

  9. latex:矩阵环境

    矩阵的最大列数值是在MaxMatrixCols计数器中设定的,默认值是10.可使用计数器设置命令修改其值,例如需要用到15列:\setcounter{MaxMatrixCols}{15};当超宽矩阵排 ...

  10. 关闭jetbrains ide support 正在调试此浏览器提示

    1 安装JetBrains IDE Support插件 插件地址 2 启用插件 3 设置访问端口 4 WebStorm中设置Live Edit 5 关闭"JetBrains IDE Supp ...