iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql事务原理
  • 436
分享到

Mysql事务原理

Mysql事务原理 2020-08-23 11:08:17 436人浏览 才女
摘要

一、什么是事务 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元); 事务的四大特性: 原子性(Atom

Mysql事务原理

一、什么是事务

事务:数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

事务的四大特性:

  • 原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离型(Isolation):一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 
  • 持久性(Durability):指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

个人认为这四大特性总结起来就是两种:

可靠性:原子性、一致性、持久性可以归纳为可靠性。可靠就是要保证数据的一致与不丢失。数据库要保证数据的一致,就要处理commit与rollBack;显然处理commit指令的时候需要记录要提交哪些数据,rollback的时候需要知道回退的原数据。Mysql中commit需要redo log,rollBack 对应undo log

并发控制(隔离性):当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用mysql 的隔离级别。

二、redo log 与undo log

1、redo log 

redo log和undo log都属于InnoDB的事务日志。redo log 主要实现数据的持久化

 InnoDB作为Mysql的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘io,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。

如上图所示mysql采用redo log来处理该问题:当数据修改时,除了修改Buffer Pool中的数据,还会在redo log Buffer 中记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。

MySQL支持用户自定义在commit时如何将log buffer中的日志刷log file中。这种控制通过变量 innodb_flush_log_at_trx_commit 的值来决定。该变量有3种值:0、1、2,默认为1。但注意,这个变量只是控制commit动作是否刷新log buffer到磁盘。

  • 当设置为1的时候,事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
  • 当设置为0的时候,事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
  • 当设置为2的时候,每次提交都仅写入到os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。

既然redo log也需要在事务提交时将日志写入磁盘,为什么它比直接将Buffer Pool中修改的数据写入磁盘(即刷脏)要快呢?主要有以下两方面的原因:

  • 刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO。
  • 刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入;而redo log中只包含真正需要写入的部分,无效IO大大减少。

2、undo log

undo log 的写入时机与redo log一致。

InnoDB实现回滚,靠的是undo log:当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

undo log属于逻辑日志,它记录的是sql执行相关的信息。当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作:对于每个insert,回滚时会执行delete;对于每个delete,回滚时会执行insert;对于每个update,回滚时会执行一个相反的update,把数据改回去。以update操作为例:当事务执行update时,其生成的undo log中会包含被修改行的主键(以便知道修改了哪些行)、修改了哪些列、这些列在修改前后的值等信息,回滚时便可以使用这些信息将数据还原到update之前的状态。

三、Mysql的机制

当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,mysql的锁机制可以达到该目的

1. 按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。

MyISAM和InnoDB存储引擎使用的锁:

  • MyISAM采用表级锁(table-level locking)。
  • InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

行级锁:行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁 :页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

从锁的类别上来讲,有共享锁和排他锁。

  • 共享锁(S锁): 又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。事务T对数据对象A加上共享锁,则事务T可以读A但不能修改A,其他事务只能再对A加共享锁,而不能加排他锁,直到T释放A上的共享锁。这保证了其他事务可以读A,但在T释放A上的共享锁之前不能对A做任何修改。
  • 排他锁(X锁): 又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个。若事务T对数据对象A加上排他锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的排他锁之前不能再读取和修改A。

2、InnoDB锁的特性

由于 MySQL 的Innodb引擎的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。

在不通过索引条件查询的时候,InnoDB使用的是表锁!

当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论 是使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。
即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同 执行计划的代价来决定的,如果 MySQL 认为全表扫 效率更高,比如对一些很小的表,它 就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时, 别忘了检查 SQL 的执行计划(explain查看),以确认是否真正使用了索引。

三、Mysql的隔离机制

Read uncommitted 读未提交:READ UNCOMMITTED级别忽略其它事务放置的锁。使用READ UNCOMMITTED级别运行的事务,能够读取尚未由其它事务提交的改动后的数据值,这些行为称为“脏”读。我们所说的脏读,两个并发的事务,事务A可以读取到事务B未提交的数据。假设事务A回滚,事务B就读取了一行没有提交的数据。这种数据我们觉得是不存在的。

Read committed 读提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,但仍然存在不可重复读和幻读问题。大多数数据库的默认级别就是Read committed。比方SQL Server , oracle

Repeatable read 反复读:该级别指定了在当前事务提交之前,其它不论什么事务均不能够改动或删除当前事务已读取的数据。并发性低于 READ COMMITTED。由于已读数据的共享锁在整个事务期间持有,而不是在每一个语句结束时释放。这个隔离级别仅仅是说,不可以改动和删除,可是并没有强制不能插入新的满足条件查询的数据行。所以会产生“幻读”;Mysql的默认隔离级别就是Repeatable read

Serializable 串行读:完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读(Read uncommitted) 最低级别隔离,只能保证不读取物理上损坏的数据
已提交读(Read committed) 语句级别
可重复读(Repeatable read) 事务级别
可序列化(Serializable) 最高级别,事务级
  • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新了原有的数据。不可重复读主要针对的是update与delete
  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。幻读主要是针对insert;

1、mysql解决幻读的方式:mvcC

在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。 在实际操作中,存储的并不是时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。 在可重读Repeatable reads事务隔离级别下:

  • SELECT时,读取创建版本号<=当前事务版本号,并且会移除版本号为空或>当前事务版本号的数据行。
  • INSERT时,保存当前事务版本号为行的创建版本号
  • DELETE时,保存当前事务版本号为行的删除版本号
  • UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行

举例说明MVCC如何避免幻读的:事务A读取age<20的数据,返回5条,Mysql为其创建的事务版本号是10001;此时事务B插入age=18的一条数据,Mysql为其创建的事务版本号是10001;紧接着事务A再次查询age<20的数据,返回依然是5条,也就是事务B新插入的数据对于事务A来说是隔离的。

由此我们发现在RR级别中,通过MVCC机制,虽然让数据变得可重复读,并且避免的幻读,但我们读到的数据可能是历史数据,是不及时的数据,不是数据库当前的数据!这在一些对于数据的时效特别敏感的业务中,就很可能出问题。对于这种读取历史数据的方式,我们叫它快照读 (snapshot read),而读取数据库当前版本数据的方式,叫当前读 (current read)。很显然,在MVCC中是采取的快照读;如果要实现当前读就需要使用锁机制。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql事务原理

本文链接: https://www.lsjlt.com/news/8365.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL核心技术原理之:MySQL事务隔离级别与原理
    作者:禅与计算机程序设计艺术 1.简介 随着互联网的飞速发展,网站的并发访问量越来越大,数据库的事务处理能力要求也越来越高。在这种情况下,如果应用服务器直接对数据库进行操作,可能会出现资源竞争、数据...
    99+
    2023-10-20
    大数据 人工智能 语言模型 Java Python 架构设计
  • MySQL RC事务隔离的实现原理
    摘要:Read Committed事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读、幻读问题。ReadView机制基于undo log版本链条实现...
    99+
    2024-04-02
  • MySql事务及ACID实现原理详解
    目录逻辑架构和存储引擎自动提交特殊操作ACID 特性原子性持久性隔离性脏读、不可重复读和幻读事务隔离级别MVCC一致性逻辑架构和存储引擎 自动提交 MySQL 中默认采用的是自动提...
    99+
    2024-04-02
  • MySQL数据库事务原理及应用
    目录1 事务的使用1.1 事务概念1.2 事务的提交1.3 事务的常见操作2 事务隔离2.1 事务并发时出现的问题2.2 事务隔离级别1 事务的使用 1.1 事务概念 事务就是一组DML语句组成,这些语句在逻辑上存在相关...
    99+
    2023-04-27
    MySQL数据库事务 MySQL数据库事务管理
  • MySQL事务的原理及应用场景
    MySQL事务的原理及应用场景 在数据库系统中,事务是一组SQL操作的集合,这些操作要么全部成功执行,要么全部失败回滚。MySQL作为一种常用的关系型数据库管理系统,支持事务的特性,能...
    99+
    2024-03-02
    应用 mysql 事务
  • mysql事务回滚的原理是什么
    MySQL中的事务回滚是通过将数据库恢复到事务开始之前的状态来实现的。事务回滚的原理如下:1. MySQL使用日志来记录所有对数据库...
    99+
    2023-10-09
    mysql
  • MySQL数据库本地事务原理解析
    在经典的数据库理论里,本地事务具备四大特征: 原子性 事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败; 一致性 事务执行前后,所有的数据都应该处于一致性状态---...
    99+
    2024-04-02
  • MySQL事务工作流程原理是什么
    本篇内容介绍了“MySQL事务工作流程原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!事务的原子性...
    99+
    2024-04-02
  • MySQL中的事务和MVCC原理是什么
    这篇“MySQL中的事务和MVCC原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2024-04-02
  • MySQL事务:原理、类型和使用场景
    一、事务的概念 在数据库中,事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单元。事务具有ACID(原子性、一致性、隔离性和持久性)特性,保证了数据库操作的正确性和可靠性。 二、事务的特性 原子性(Atom...
    99+
    2023-09-02
    数据库 mysql sql
  • 【MySQL】一文带你理解索引事务及其原理
    MySQL- 索引事务 文章目录 MySQL- 索引事务索引操作==索引原理== 事务操作并发执行 索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。...
    99+
    2023-10-07
    mysql oracle 数据库
  • mysql事务特性的实现原理是什么
    MySQL事务特性的实现原理是通过使用日志和锁机制来保证事务的原子性、一致性、隔离性和持久性。1. 原子性:MySQL使用redo日...
    99+
    2023-10-12
    mysql
  • 了解MySQL MVCC 原理,优化数据库事务处理
    了解MySQL MVCC 原理,优化数据库事务处理近年来,随着数据量的不断增长和应用需求的提升,数据库事务处理的性能优化成为了数据库开发和运维中一个非常重要的环节。MySQL作为最常用的开源关系型数据库之一,其MVCC(Multi-Vers...
    99+
    2023-10-22
    MySQL 优化 mvcc
  • Spring事务原理解析
    目录前言问题描述代码复现排查1. 锁失效2. 事务隔离级别3. 修改Spring事务传播配置解决方案前言 最近在编写公司APP产品的商品砍价功能,其中有一个接口涉及并发访问。自测时通...
    99+
    2022-12-20
    Spring事务管理机制 Spring事务管理方式 Spring事务底层
  • PostgreSQL事务处理机制原理
    本篇内容主要讲解“PostgreSQL事务处理机制原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL事务处理机制原理”吧!背景说明:以ACI...
    99+
    2024-04-02
  • MySQL索引的理解学习,面试不问索引原理就是事务原理
    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B树, 不是平衡树二叉树,红黑树? 索引总...
    99+
    2023-09-28
    面试 学习 mysql 索引
  • Mysql事务隔离级别原理的示例分析
    这篇文章主要介绍Mysql事务隔离级别原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说说事务的隔离级别吧?老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问...
    99+
    2024-04-02
  • mysql事务和隔离级别底层原理浅析
    目录前言一、事务底层原理浅析原子性:持久性隔离性:一致性:二、隔离级别底层原理浅析三、总结前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一...
    99+
    2024-04-02
  • MySQL事务的原子性分析
    这篇文章主要讲解了“MySQL事务的原子性分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务的原子性分析”吧!一、事务的ACID特性:&nbs...
    99+
    2024-04-02
  • mysql事务处理(转)
    mysql事务处理(转)[@more@]缺省的,MySQL 运行在 autocommit 模式。这就意味着,当你执行完一个更新时,MySQL 将立刻将更新存储到磁盘上。 如果你使用事务安全表 (例如 Inn...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作