事务

一个事务会涉及到大量的cpu计算和IO操作,这些操作被打包成一个执行单元,要么同时都完成,要么同时都不完成.

事务是一组原子性的sql命令或者说是一个独立的工作单元,如果数据库引擎能够成功的对数据库应用该组的全部sql语句,那么就执行该组命令

如果其中有任何一条语句因为崩溃或者其它原因无法执行,那么该组中所有的sql语句都不会执行

如果没有显示启动事务,数据库会根据autocommit的值.默认每条sql操作都会自动提交.

原子性

一个事务中的所有操作,要么都完成,要么都不执行.对于一个事务来说,不可能只执行其中的一部分.

一致性

数据库总是从一个一致性的状态转换到另外一个一致性状态.

隔离性

一个事务所做的修改在最终提交以前,对其它事务是不可见的.多个事务之间的操作相互不影响. 每降低一个事务隔离级别都能提高数据库的并发

1.读未提交          其它事务未提交就可以读
       2.读已提交          其它事务只有提交了才能读
       3.可重复读          只管自己启动事务时候的状态,不受其它事务的影响(mysql默认)
       4.事务串行          按照顺序提交事务保证了数据的安全性,但无法实现并发

持久性

一旦一个事务已经提交了,就算服务器崩溃,仍然需要在下次启动的时候自动恢复.

结合事务日志完成:

事务日志写入磁盘的时候是顺序IO,写数据文件的时候是随机IO

一旦事务提交了,必须立即执行一个IO操作,确保此事务立即写入磁盘.

事务的状态

活动

部分提交

失败

中止

提交

事务一旦成功提交,便无法再撤销.

事务并发访问控制方式:

时间

多版本和快照隔离(mvcc)

MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低,虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行.

MVCC的实现是通过保存数据在某个时间点的快照来实现的,也就是说,不管需要执行多长时间,只要事务开始时间相同,每个事务看到的数据都是一致的,事务开始的时间不同时,每个事务对同一张表,同一时刻看到的数据可能是不一样的(因为不同的时间点可能数据就已经产生了不同的快照版本,而每个事务在默认的RR隔离级别下只能看到事务开始时的数据快照)

innodd的mvcc是通过在每行记录后面保存两个隐藏列来实现的.这两个列,一个保存了行的创建时间.一个保存了行的过期时间(删除时间).列里面存储的并不是实际的时间值.而是系统版本号.每开启一个新的事务,系统版本号都会自动递增.

一个事务在开启的时刻的系统版本号作为当前事务的版本号,用来和查询到的每行记录的版本号做对比.mvcc具体操作如下:

select:

A:过滤创建版本

innodb只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始之前已经存在,要么是事务自身插入或修改的数据.

B: 过滤删除版本

行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除(即,这样做的目的是为了事务不会读取到被真正删除的行,删除版本号小于当前事务版本号的表示操作删除记录的事务已经提交--数据已经被删除,删除版本号大于当前事务版本号的表示这个事务是在当前事务之后开始的--当前事务开始时这些记录是还存在的,根据事务的隔离性,一致性要求,之后开始的事务操作的记录并提交,对当前事务不可见,所以还需要当前事务能够查询这些记录--只能够查询,不能够修改和删除)

只有满足以上两个条件的才可以返回作为查询结果

insert:

innodb为新插入的每一行保存当前系统版本号作为行版本号

delete:

innodb为删除的每一行保存当前系统版本号作为行删除标识

update:

innodb为插入一行新记录,保存当前系统版本号作为行版本号

修改表中原来行把当前系统版本号更新到原来的行作为行删除版本号

保存这两个额外的系统版本号,使大多数读操作都可以不用加锁,这样设计使得读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行,不足之处是每行记录都需要额外的存储空间,需要做更多的行检查工作,以及一些额外的维护工作。

MVCC只在repeatable-read和read-committed两个隔离级别下才工作,其他两个隔离级别都和MVCC不兼容,因为read uncommitted总是读取最新的数据行,而不是符合当前事务版本的数据行,而serializeble则会对所有读取的行都加锁。

另外要注意:MVCC在RR和RC隔离级别下的区别,在RR隔离级别下,一个事务只能读取到事务开始的那个时刻的数据快照,即,别的事务修改并提交的数据在自身没有提交之前一般读取不到(加for update语句的select除外,因为这个语句要对数据加X锁必须读取最新的数据快照),在RC隔离级别下,事务总是读取数据行的最新快照,即会产生不可重复读的问题。

死锁

两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源的状态

事务提交

自动提交

mysql默认采用自动提交(AUTOCOMMIT)模式.如果没有显示的开始一个事务,那么每条sql语句都会被当作一个事务执行提交的操作

当AUTOCOMMIT=0的时候所有的sql语句都是在一个事务中,直到显示的执行COMMIT和ROLLBACK回滚该事务结束.同时又开始了另外一个新的事务.

显式提交

开启事务

START TRANSACTION

结束事务

(1)  COMMIT:         提交

(2)  ROLLBACK:    回滚

注意:一旦一个事务成功提交,将无法回滚.一个事务要想回滚,只能在没有提交成功之前执行回滚

只有事务型存储引擎中的DML语句方能支持此类操作

建议:显式请求和提交事务,而不要使用“自动提交”功能 set autocommit={1|0}

事务支持保存点 savepoint:

SAVEPOINT identifier

ROLLBACK [WORK] TO [SAVEPOINT]  identifier

RELEASE SAVEPOINT identifier

事务日志

事务要保证ACID的完整性必须依靠事务日志做跟踪,每一个操作在真正写入数据数据库之前,先写入到日志文件中
     如要删除一行数据会先在日志文件中将此行标记为删除,但是数据库中的数据文件并没有发生变化.

只有在(包含多个sql语句)整个事务提交后,再把整个事务中的sql语句批量同步到磁盘上的数据库文件

在事务引擎上的每一次写操作都需要执行两遍:
        1.先写入日志文件中
                写入日志文件中的仅仅是操作过程,而不是操作数据本身,所以速度比写数据库文件速度要快很多.
        2.然后再写入数据库文件中

写入数据库文件的操作是重做事务日志中已提交的事务操作的记录.

日志组
         一般不止设置一个日志文件,一个文件写满之后使用另外一个日志文件提高服务器效率.

日志文件的日志同步到磁盘后空间会自动释放,单个日志文件不宜设置过大     如果日志文件过大mysql进程在把日志同步到数据文件的时候可能会崩溃

事务日志的用途

事务日志可以帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据的时候只需要修改其内存拷贝,再把该行为记录到持久在磁盘的事务日志中.而不用每次都将修改的数据本身持久到磁盘.事务日志采用的是追加方式,因此写日志的操作是磁盘上一小块区域的顺序IO,而不像随机IO需要磁盘在多个地方移动.所以采用事务日志的方式相对来说要快的多,事务日志持久后,内存中的修改在后台慢慢的刷回磁盘.期间如果系统发生崩溃,存储引擎在重启的时候依靠事务日志自动恢复这部分被修改数据

转载于:https://www.cnblogs.com/Justsoso-WYH/p/9633027.html

Mysql事务原理介绍相关推荐

  1. MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)

    MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...

  2. Linux服务器开发【有用知识】—MySQL事务原理分析

    前言 今天的目标是学习MySQL事务原理分析,但是却似乎总是非常不顺利,概念和实操实在多到令人发指,故干脆轻松学完一节课,等到时机到了再重新刷一遍吧! 一.事务是什么? 将数据库从一致性状态转化成另一 ...

  3. MySQL事务原理浅析

    前言 ​ 因为自己对数据的可靠性,可用性方面特别感兴趣,所以在MySQL事务方面看了很多资料,也看了很多博客,所以想到自己也写一篇博客整理整理自己所学内容,尽量用自己的语言解释得通俗易懂. 事务经典场 ...

  4. mysql 事务原理详解

    前言 事务是mysql Innodb引擎的一大特点,可以说,在日常开发中,对于mysql事务的使用无处不在,因此深入了解并掌握mysql的事务原理很有必要. 一.mysql事务简介 事务 是一组操作集 ...

  5. Mysql事务原理拆解

    1.mysql事务基本概念 事务特性 ACID A 原子性 I 隔离性 D 持久性 C 一致性 并发问题 脏读 读取到未提交的数据. 不可重复读 两次读取结果不同 幻读 select操作得到的结果所表 ...

  6. RocketMQ分布式事务原理介绍

    RocketMQ实现分布式事务原理 1.知识准备 在系统架构从单体到分布式.SOA.微服务的发展过程中,因为流量的增多出现了大量消息堆积问题的需求,在这种背景下,阿里开发出rocketmq来解决该问题 ...

  7. MySQL事务原理详解,一篇文章让你搞懂

    事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况.我们把这种要么全做,要么 ...

  8. MySQL事务原理之事务概述和隔离级别

    MySQL事务概述和隔离级别 事务 事务的特征 事务的控制语句 事务的生命周期 事务执行过程 ACID特性 原子性(A) 一致性(C) 隔离性(I) 持久性(D) 隔离级别 命令 不同隔离级别并发异常 ...

  9. Mysql工作原理介绍

    Mysql 工作原理图 Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. mysql原理图各个组件说明: connectors 与其他编程语言中的sql 语句进行交互,如php.jav ...

最新文章

  1. OGG学习笔记04-OGG复制部署快速参考
  2. SAP MM 标准的采购订单预付款功能介绍
  3. Atitit 常见每日流程日程日常工作.docx v4
  4. fluentftp 积极拒绝_【新时代文明实践】光明街道光大社区开展“光盘行动 拒绝浪费 从我做起”新时代文明实践活动...
  5. 物联网、云计算商用或从“家庭自动化”得以突破
  6. Codeforces Round #682 (Div. 2)D Powerful Ksenia ///思维
  7. Java 知识总结大汇总!看完哪个都变大佬!
  8. python 和scikit安装
  9. DuiLib(一)——窗口及消息
  10. java ajax传值到后台_java ajax发送数据到后台,中文乱码
  11. linux开发windows游戏,安装Wine 1.9.19(开发版)在Linux上运行Windows游戏和应用程序...
  12. 织梦插件,dede采集、发布、翻译伪原创插件
  13. Android设备指纹认证
  14. 关于DEP(数据执行保护)的分析
  15. 微信机器人网页版接口详解
  16. 冯·诺依曼、哈佛、改进型哈佛体系结构解析
  17. 计算mysql内存使用
  18. 关于浅拷贝、深拷贝的探究
  19. LVGL打印LOG日志
  20. 外汇交易与实务--外汇交易市场

热门文章

  1. 《PyCharm2019安装教程》
  2. LSF_安装(UNIX or Linux)
  3. Eterm协议中文汉字编码
  4. php微信支付需要哪些设置,如何申请和配置微信支付接口?
  5. 如何礼貌的拒绝offer
  6. 工业强国之路任重道远,制造业乘“疾风”突出重围
  7. matlab画椭圆 长轴 短轴,跟踪目标的快速椭圆拟合方法
  8. 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC
  9. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)切题报告(A-B题)
  10. macbook苹果电脑新手快速上手