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. HTML基础-05

    字体 文本颜色:color:red;字体分类: 衬线字体serif --字体宽度各异,有衬线 --Times.Georgia.宋体 无衬线字体sans-serif --字体宽度各异,无衬线 --Hel ...

  2. java面试的一些问题

    面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...

  3. MySQL查看正在执行的SQL进程

    查看正在执行的SQL进程: show processlist; 查出来之后, 可以使用下面的命令终止SQL进程: kill ${进程ID}

  4. SpringBoot ---yml 整合 Druid(1.1.23) 数据源

    SpringBoot ---yml 整合 Druid(1.1.23) 数据源 搜了一下,网络上有在配置类写 @Bean 配置的,也有 yml 配置的. 笔者尝试过用配置类配置 @Bean 的方法,结果 ...

  5. unity探索者之复制内容到剪贴板

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8417014.html unity中提供的TextEditor类,只能在window ...

  6. PythonCrashCourse 第八章习题

    编写一个名为display_message() 的函数,它打印一个句子,指出你在本章学的是什么.调用这个函数,确认显示的消息正确无误 def display_message(): print(&quo ...

  7. XSS的构造技巧

    XSS的构造技巧 By:Mirror王宇阳 E-mail:2821319009@qq.com 本文为长期持续维护,一旦遇到新的技术技巧将及时更新本文内容 非常的欢迎技术大佬纠正并补充,也欢迎技术同僚讨 ...

  8. 数字货币比特币以太坊买卖五档行情数据API接口

    数字货币比特币以太坊买卖五档行情数据API接口       数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...

  9. [CSP-S2019]Emiya 家今天的饭 题解

    CSP-S2 2019 D2T1 很不错的一题DP,通过这道题学到了很多. 身为一个对DP一窍不通的蒟蒻,在考场上还挣扎了1h来推式子,居然还有几次几乎推出正解,然而最后还是只能打个32分的暴搜滚粗 ...

  10. 模型层中QuerySet的学习

    创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...