一、概述

  • 事务机制主要用于实现数据库对并发访问的支持和在并发访问下的数据一致性和可靠性(当多个用户访问同一份数据,一个用户更改该事物时可能会有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态转为另外一个一致性状态,使用事务是非常有必要的。)。MySQL的myisam存储引擎是不支持事务的,通过表锁来实现数据的可靠性,类似于Java多线程的同步锁synchronized,避免并发修改,但是并发性能较差,比较适合OLAP的应用,同时数据库奔溃恢复比较麻烦。
  • innodb存储引擎是支持事务的,支持多个客户端高性能地进行并发操作,相对myisam并发性能较好,比较适合OLTP的应用。innodb存储引擎实现了事务的ACID特性,即原子性,一致性,隔离性和持久性。
  • ACID(事务处理机制)特性主要用于保证并发访问时,数据的一致性和可靠性,是对简单地进行加表锁实现串行化访问来保证数据一致性和可靠性的一种改进和优化,实现了多个客户端的并发访问。

二、ACID实现

1. SQL标准的ACID的定义:

  • A:原子性,一次数据库访问包含的多个数据库操作是一个整体,要么全部成功执行,要么全部失败回滚,相当于一个原子操作,不允许部分成功,部分失败;
  • C:一致性,事务执行前后,数据保持一致状态,不存在数据不一致问题;
  • I:隔离性,或者称为并发性,实现多个客户端的并发事务操作相互隔离,互不影响。不过这个在数据库实现当中,影响程度一般需要和并发性取一个折中,即定义了多个隔离级别,每个隔离级别的隔离程度和并发性存在差异,具体后面分析。
  • D:只要事务成功提交,则数据保证持久化保存,即使数据库奔溃也能恢复回来,保证数据的可靠性。

2. Innodb的ACID实现
innodb存储引擎的原子性A和持久性D主要是通过redo重做日志来实现的,数据一致性除了redo日志外,需要undo日志来辅助实现,即当事务提交失败时,通过undo日志来实现回滚,取消该事务对数据库的操作。隔离性I主要是通过锁和MVCC机制来实现。

 a. redo日志(重做日志):原子性、持久性

  • 事务在执行时需要将执行的事务日志写入到日志文件里,对应的日志文件为重做日志。当sql进行数据库更新操作时,首先将重做日志写入到日志缓冲区,客户端执行commit命令提交时,日志缓冲区的内容会被刷新到磁盘,日志缓冲区的刷新方式或者时间间隔可以通过参数innodb_flush_log_at_trx_commit控制。
  • redo日志主要是记录对数据的物理修改,在事务提交时,必须先将本次事务的所有修改写到redo日志中进行持久化,实现了原子性和持久性。redo日志写入成功之后才进行实际的事务提交,对数据库的数据进行实际的修改。
  • 所以redo日志记录了所有的数据修改操作,如果在事务提交时写入redo日志成功,再进行数据库修改时,数据库发送了崩溃,则可以在重启时,通过redo日志来恢复这些修改。如果事务提交之前,数据库奔溃,则该次事务操作的所有修改都没有执行,保证了原子性。

b. undo(回滚)日志:一致性

  • 与REDO日志相反,UNDO日志主要用于事务异常时的数据回滚,具体是复制食物前的数据库内容到UNDO缓冲区,在合适的时间将内容刷新到磁盘。UNDO日志均放在表空间.ibd数据文件中。
  • 相对于redo日志记录数据的物理修改,undo日志是逻辑记录,是MySQL数据库内部的特殊的segment,segment内部对应每个事务都有一条记录,这个记录记录了该事务所有修改操作的逆过程。
  • 在事务操作过程中,每个修改操作都会记录在undo日志中,记录到undo日志的内容与该次修改操作相反,如INSERT对应DELETE,UPDATE则对应更新前的记录(这里记录了该数据的数据快照,负责实现了MVCC机制)。
  • 所以当该事务需要回滚时,只需要执行该事务对应的undo日志中的记录,即逆向的SQL语句,如插入了10条记录,则删除这10条记录。
  • 对于undo日志的删除,不是事务提交后就马上删除的,而是通过purge线程来完成的。由于MVCC机制是基于undo日志来实现,故该事务对应的数据行的快照数据可能被其他事务在引用,所以通过purge线程来检测是否存在其他事务在引用该数据行的快照,如果没有才进行该事务对应的undo日志的删除。

c. 锁:隔离性

  • 事务的隔离性主要是针对写操作,因为读操作是不会对数据进行修改,故不存在隔离的说法,通过隔离多个对相同的数据进行并发修改的事务,保证数据的一致性。
  • 对于数据的修改操作一般需要加互斥锁(记为X锁),如果一个事务对数据进行了加X锁,则其他需要修改该数据的事务就需要阻塞等待该事务释放该X锁才能继续执行,所以加锁操作直接影响了并发性能。基于并发性和数据一致性的考虑,隔离性定义了READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ, SERIALIZABLE这四个隔离级别,并发性能依次变差,数据一致性依次变强。

三、隔离性

  • 以上分析了事务的隔离性主要是通过锁和MVCC机制来实现,而隔离性主要是解决并发事务操作存在的以下问题,并通过事务隔离机制来规避这些问题,不过不是所有的隔离级别都会解决所有的这些问题,因为还需要与并发性取一个折中。

1. 事务(并发操作)存在的问题

a. 脏读

  • 事务A读取了事务B已经修改但尚未提交的数据。若事务B回滚数据,事务A的数据存在不一致性的问题。

b. 幻读

  • 事务A根据相同条件第二次查询到事务B提交的新增数据,两次数据结果集不一致。不符合事务的隔离性。

c. 不可重复读

  • 事务A第一次读取最初数据,第二次读取事务B已经提交的修改或删除数据。导致两次读取数据不一致。不符合事务的隔离性。

d. 更新丢失

  • 数据覆盖:一个事务覆盖了另外一个事务的执行结果;
  • 数据脏读:一个事务基于另外一个未提交事务的数据修改来做修改,当另外一个事务回滚后,当前事务基于该脏数据进行修改导致数据不一致。

脏读是事务B里面修改了数据,

幻读是事务B里面新增了数据。

2. 隔离级别:锁与并发性能的权衡

为了解决以上并发事务操作存在的问题和与并发性取个折中,定义了以下四个隔离级别:

a. READ-UNCOMMITTED:读未提交
没有解决以上的任何一个问题,读写均不需要加锁,数据一致性最差,并发性能最好,存在并发操作的应用,如OLTP,基本不会使用这个隔离级别;
b. READ-COMMITTED:读提交
能够读取其他已提交事务的数据修改,不存在脏读和更新丢失问题,存在幻读和不可重复读问题。
c. REPEATABLE-READ:可重复读

  • 解决了以上的所有问题,即不存在脏读,幻读,不可重复读和更新丢失问题,这也是MySQL的innodb存储引擎的默认隔离级别。
  • 不可重复读的解决:读提交和可重复读的读操作都是基于MVCC机制来实现一致性无锁读取,区别在于可重复读是基于事务开始时的数据快照,整个事务期间不变,故多次读取数据一致;而读提交是基于数据的最新快照,即其他已提交事务的最新修改快照,故事务期间的两次读取可能不一样。
  • 幻读的解决:读提交和可重复读的写操作都是基于互斥行锁实现,但是二者使用的锁的算法存在差别,读提交只锁住匹配的行,可重复读锁住匹配的行和周围的行(间隙锁的存在),即可重复读需要锁住更多的数据行,其他事务不能对这些被锁住的行进行插入、删除操作,故不会新增或减少数据行,不存在幻读发生。具体可参考::MySQL学习(五):Innodb存储引擎锁与MVCC机制的实现原理
  • REPEATABLE-READ,相对于SERIALIZABLE串行化,数据一致性方面唯一的不足是基于MVCC机制读取的数据的快照版本,故数据可能存在延迟。

d. SERIALIZABLE:串行化
解决了以上的所有问题,对读写操作均需要加锁,读操作加共享锁,写操作加互斥锁,串行化了多个事务操作,并发性能最差,数据一致性最好。

MySQL数据库之事务相关推荐

  1. MySQL数据库的事务管理

    SQL语句在执行的过程中分为二个阶段: 1 : 执行SQL语句 2 : 将执行结果提交给数据库. 我们打开一个窗口,作为一个新的用户,现在我们看见,数据是没有变化的.也就是说,当一个事务没有完成的时候 ...

  2. MySQL数据库:事务和ACID实现原理

    一.什么是事务: 数据库的事务是并发控制的基本单位,是指逻辑上的一组操作,要么全部执行,要么全部不执行. 1.事务的特性: (1)原子性:事务是一个不可分割的工作单元,事务里的操作要么都成功,要么都失 ...

  3. mysql数据库执行事务日志_第十章 MySQL事务及其日志介绍

    一.数据库升级 #1.提出方案 1)升级的方法 2)升级的步骤 3)升级的时间 4)升级步骤可能会出现的问题 5)出现的问题怎么解决,解决时间 6)升级后出现的问题 #2.搭建新的数据库 #3.备份就 ...

  4. MySQL数据库分布式事务XA实现原理分析

    MySQL XA分为两类,内部XA与外部XA;内部XA用于同一实例下跨多个引擎的事务,由大家熟悉的Binlog作为协调者;外部XA用于跨多MySQL实例的分布式事务,需要应用层介入作为协调者(崩溃时的 ...

  5. mysql数据库的事务 acid 隔离级别 脏读 脏写 幻读 不可重复读

    事务的四大特征 原子性(atomicity):要么全部提交(commit),要么全部回滚(rollback) 一致性(consistency):数据从一个合法状态转换成另一种合法状态 隔离性(isol ...

  6. mysql数据库之事务与存储过程

    事务 什么是事务? 事务是指一些SQL语句的集合,这些语句同时执行成功完成某项功能 事务的CAID特性: 原子性:一个事务的执行是整体性的,要么内部所有语句都执行成功,要么一个都别想成功 一致性:事务 ...

  7. MySQL数据库的事务开启,提交和回滚

    事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位. 基于事务的原子性.一致性.隔离性和持续性特征,可以将相关的数据操作定义到一个事务 ...

  8. Mysql数据库之事务(山高水远,他日江湖再见)

    文章目录 一.事务的概念 二.事务的ACID特点 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(lsolation) 4.持久性(Durability) 三.并发 ...

  9. mysql数据库事务_MySQL数据库的事务管理

    小伙伴们不好意思,这两天有事没有及时的更新哈~希望小伙伴们见谅,那么开始我们今天的分享. MySQL 数据库的事务 我们之前分享数据库的数据操作,无外乎对数据库的数据进行增.删.改.查.就比如我们去买 ...

最新文章

  1. css禁止鼠标双击选中文字
  2. mysql left join on_mysql,left join on
  3. [转]常用数字处理算法的Verilog实现
  4. php非,通过非数字和字符的方式实现PHP WebShell
  5. 将z-blog改成英文blog所遇到的问题
  6. Python基础-day01
  7. UVA12439 February 29【日期计算】
  8. 自建家庭私有云NAS——磁盘管理系统
  9. 在C#中控制ListBox某一行的字体颜色
  10. IE浏览器打不开网页有什么解决的方法
  11. 叮当管家显示服务器错误,叮当管家【制卡器故障】
  12. 义帝熊心--秦末汉初
  13. 协议篇————3、DUP协议详解
  14. Zookeeper + Centos7 详细安装教程
  15. 北京中医药大学22春《生物化学B》平时作业1【专职辅导答案】
  16. win8.1CPU使用率过高、卡顿、破音问题整理
  17. CentOS 初次登录mysql
  18. 【解决】JSONDecodeError: Expecting property name enclosed in double quotes
  19. SAP ERP管理系统 | SAP软件 | SAP Business One | SAP Business ByDesign 企业信息化解决方案
  20. 物联网与射频识别技术,课程实验(四)

热门文章

  1. 还需要更多东西吗?这里有一些要做的事情
  2. python利用myqr库生成二维码
  3. Python学习笔记之元组
  4. 字符串匹配(一)—— KMP / MP
  5. html游戏图标库,又一款开源图标库 CSS.GG,值得一用
  6. nginx 80端口重定向到443端口
  7. 云栖社区,诚邀技术同仁一同入驻
  8. vue2 枚举类型转换
  9. 美国纽约拟将电话亭变WiFi热点
  10. jQuery入门第三天