返回顶部
首页 > 资讯 > 数据库 >如何在Mysql中实现事务ACID
  • 531
分享到

如何在Mysql中实现事务ACID

2024-04-02 19:04:59 531人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关如何在Mysql中实现事务ACID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原子性根据定义,原子性是指一个事务是一个不可分割的工作单

这期内容当中小编将会给大家带来有关如何在Mysql中实现事务ACID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

原子性

根据定义,原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账成功,要么转账失败,是不存在中间的状态!

如果无法保证原子性会怎么样?

OK,就会出现数据不一致的情形,A账户减去50元,而B账户增加50元操作失败。系统将无故丢失50元~

隔离性

根据定义,隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

如果无法保证隔离性会怎么样?

OK,假设A账户有200元,B账户0元。A账户往B账户转账两次,金额为50元,分别在两个事务中执行。如果无法保证隔离性,会出现下面的情形

如何在Mysql中实现事务ACID

如图所示,如果不保证隔离性,A扣款两次,而B只加款一次,凭空消失了50元,依然出现了数据不一致的情形!

ps:可能有细心的读者已经发现了,mysql中是依靠来解决隔离性问题。嗯,我们后面来说明。

持久性

根据定义,持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

如果无法保证持久性会怎么样?

在Mysql中,为了解决CPU和磁盘速度不一致问题,Mysql是将磁盘上的数据加载到内存,对内存进行操作,然后再回写磁盘。好,假设此时宕机了,在内存中修改的数据全部丢失了,持久性就无法保证。

设想一下,系统提示你转账成功。但是你发现金额没有发生任何改变,此时数据出现了不合法的数据状态,我们将这种状态认为是数据不一致的情形。

一致性

根据定义,一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。
那什么是合法的数据状态呢?

oK,这个状态是满足预定的约束就叫做合法的状态,再通俗一点,这状态是由你自己来定义的。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!

如果无法保证一致性会怎么样?

例一:A账户有200元,转账300元出去,此时A账户余额为-100元。你自然就发现了此时数据是不一致的,为什么呢?因为你定义了一个状态,余额这列必须大于0。

例二:A账户200元,转账50元给B账户,A账户的钱扣了,但是B账户因为各种意外,余额并没有增加。你也知道此时数据是不一致的,为什么呢?因为你定义了一个状态,要求A+B的余额必须不变。

实战解答

问题一:Mysql怎么保证一致性的?

OK,这个问题分为两个层面来说。

数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现aiD三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。

但是,如果你在事务里故意写出违反约束的代码,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给B账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑。

从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!

问题二: Mysql怎么保证原子性的?

OK,是利用Innodb的undo log。

undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。

例如

  • (1)当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据

  • (2)当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作

  • (3)当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作

undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

ps:具体的undo log日志长啥样,这个可以写一篇文章了。而且写出来,看的人也不多,姑且先这么简单的理解吧。

问题三: Mysql怎么保证持久性的?

OK,是利用Innodb的redo log。

正如之前说的,Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。

怎么解决这个问题?

简单啊,事务提交前直接把数据写入磁盘就行啊。

这么做有什么问题?

  • 只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了。毕竟一个页面16kb大小,你只改其中一点点东西,就要将16kb的内容刷入磁盘,听着也不合理。

  • 毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的,也就是属于随机io。显然操作随机IO,速度会比较慢。

于是,决定采用redo log解决上面的问题。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。

采用redo log的好处?

其实好处就是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下

  • redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。

  • redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

ps:不想具体去谈redo log具体长什么样,因为内容太多了。

问题四: Mysql怎么保证隔离性的?

OK,利用的是锁和mvcC机制。还是拿转账例子来说明,有一个账户表如下

表名t_balance

iduser_idbalance
1A200
2B0

其中id是主键,user_id为账户名,balance为余额。还是以转账两次为例,如下图所示

如何在Mysql中实现事务ACID

至于MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。

如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。

由于MVCC机制在可重复读(Repeateable Read)和读已提交(Read Commited)的MVCC表现形式不同,就不赘述了。

但是有一点说明一下,在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。

上述就是小编为大家分享的如何在Mysql中实现事务ACID了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 如何在Mysql中实现事务ACID

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

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

猜你喜欢
  • 如何在Mysql中实现事务ACID
    这期内容当中小编将会给大家带来有关如何在Mysql中实现事务ACID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原子性根据定义,原子性是指一个事务是一个不可分割的工作单...
    99+
    2024-04-02
  • MySQL如何实现事务的ACID
    前言 最近在面试,有被问到,MySQL的InnoDB引擎是如何实现事务的,又或者说是如何实现ACID这几个特性的,当时没有答好,所以自己总结出来,记录一下。 事务的四大特性ACID 事务的四大特性ACID分别是,A-...
    99+
    2022-05-20
    MySQL 事务 MySQL 实现事务特性 MySQL 事务 acid
  • MySql事务及ACID实现原理详解
    目录逻辑架构和存储引擎自动提交特殊操作ACID 特性原子性持久性隔离性脏读、不可重复读和幻读事务隔离级别MVCC一致性逻辑架构和存储引擎 自动提交 MySQL 中默认采用的是自动提...
    99+
    2024-04-02
  • MySQL中怎么实现ACID
    本篇文章给大家分享的是有关MySQL中怎么实现ACID,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  假设你执行了一条 sql 语句:  u...
    99+
    2024-04-02
  • MySQL事务中的ACID特性是什么
    MySQL事务中的ACID特性是什么?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。一、基础概念事务(Transaction)是指访问并可能更新数...
    99+
    2024-04-02
  • 一文快速搞懂MySQL InnoDB事务ACID实现原理
    【51CTO.com原创稿件】说到数据库事务,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念。其实事务的本质就是锁、并发和重做日志的结合体。 这一篇主要讲一下 InnoDB 中的事务到底是如何...
    99+
    2024-04-02
  • MySQL事务之ACID特性的实现原理是什么
    小编给大家分享一下MySQL事务之ACID特性的实现原理是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段...
    99+
    2024-04-02
  • MySQL关系型数据库事务的ACID特性与实现
    目录1. 事务的 ACID 特性详2. MySQL 事务的实现3. Gorm 事务的使用4. Spring 事务的使用1. 事务的 ACID 特性详 ACID 是为保证事务(tran...
    99+
    2022-11-13
    MySQL关系型数据库事务 ACID特性
  • MySQL中事务和ACID的作用是什么
    今天就跟大家聊聊有关MySQL中事务和ACID的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。所谓事务(Transaction),就是通过...
    99+
    2024-04-02
  • 如何实现MySQL中的事务处理?
    如何实现MySQL中的事务处理?事务是数据库中重要的概念之一,能够保证数据的一致性和完整性,确保在并发操作中数据的正确性。MySQL作为一种常用的关系型数据库,也提供了事务处理的机制。一、事务的特点事务具有以下四个特点,通常用ACID来概括...
    99+
    2023-10-22
    MySQL 事务 处理
  • 如何在mysql中事务处理
    如何在mysql中事务处理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。事务的特性: 事务有以下四个标准属性的缩写ACID,通常被称...
    99+
    2024-04-02
  • 如何在MySQL中执行事务
    在MySQL中执行事务可以通过以下步骤: 使用BEGIN或START TRANSACTION语句开始一个事务。 在事务中执行...
    99+
    2024-04-09
    MySQL
  • 我们如何实现MySQL事务?
    我们知道,在事务中,语句是作为一个单元执行的。如果事务内的任何操作失败,则整个事务将失败并应回滚;否则,语句所做的任何更改都会保存到数据库中。为了实现事务,MySQL 提供了以下语句 -START TRANSACTION顾名思义,事务从此语...
    99+
    2023-10-22
  • 如何在Redis中实现分布式事务
    在Redis中实现分布式事务可以通过使用 Redis 的事务机制 MULTI/EXEC 和 WATCH 命令来实现。以下是实现分布式...
    99+
    2024-04-09
    Redis
  • MySQL中的事务隔离级别如何实现
    小编给大家分享一下MySQL中的事务隔离级别如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说到数据库事务,大家脑子里一定...
    99+
    2024-04-02
  • 如何实现MySQL中事务处理的语句?
    如何实现MySQL中事务处理的语句?在数据库操作中,事务处理是非常重要的一部分,它可以确保一系列的操作要么全部执行,要么全部不执行。MySQL中的事务处理可以通过以下示例代码来实现。首先,让我们创建一个示例表格来演示事务处理的语句:CREA...
    99+
    2023-11-09
    MySQL 事务 编程关键词: MySQL 事务处理语句实现
  • MySQL事务的ACID特性及并发问题实例分析
    本篇内容主要讲解“MySQL事务的ACID特性及并发问题实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事务的ACID特性及并发问题实例分析”吧...
    99+
    2024-04-02
  • MySQL是如何实现事务隔离?
    前言   众所周知,MySQL的在RR隔离级别下查询数据,是可以保证数据不受其它事物影响,而在RC隔离级别下只要其它事物commit后,数据都会读到commit之后的数据,那么事物隔离的原理是什么?是通过什么实现的呢?那肯定是通过MVC...
    99+
    2017-02-21
    MySQL是如何实现事务隔离?
  • MySQL如何实现RC事务隔离
    这篇文章给大家分享的是有关MySQL如何实现RC事务隔离的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:若为事务自...
    99+
    2023-06-29
  • SSM如何实现在Controller中添加事务管理
    目录SSM在Controller中添加事务管理1.在controller层写编程式事务【繁琐,不推荐】2.将事务配置定义在SpringMVC的应用上下文(spring-mvc.xml...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作