首页 > 数据库 >MySQL的四⼤特性

MySQL的四⼤特性

时间:2024-05-24 15:29:41浏览次数:23  
标签:事务 隔离 数据库 回滚 特性 保证 MySQL 数据

MySQL的四大特性

MySQL数据库有原⼦性(Atomicity)、⼀致性(Consistency)、隔离性(Isolation)和持久性(Durability)四大特性。

原子性

原子性确保数据库事务是不可分割的工作单位。事务中的所有操作要么全部执行成功,要么全部不执行,不会部分执行。如果事务中的任何一部分失败,整个事务就会被回滚,好像从未开始过一样。

例子

情人节我向女朋友转账520元,如果转账成功了,那么我的余额就会减少520元,我女朋友的账户余额会增加520元。如果发生某种错误,转账未成功,那么我转账这件事就会回滚到我没发起转账的状态,我的余额不会因为女朋友没有收到而少去520.

如何保证原子性?

主要是利⽤undo log(回滚⽇志),回滚日志记录事务执行前数据的状态,以便在事务需要回滚时,能够撤销已执行的操作,恢复数据库到事务开始前的状态。
例如:

  • delete⼀条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据
  • update⼀条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执⾏update操作
  • insert⼀条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执⾏delete操作

分布式数据库如何保证原子性?

(埋坑)

一致性

一致性保证事务执行前后,数据库从一个一致的状态转变为另一个一致的状态。即使在事务执行期间系统出现故障,数据库也必须保持在一个有效且符合预期的状态中。所谓一致性,就是数据符合我们对它的某些限制。比如,我转账的钱 = 我女朋友收到的钱。

如何保证一致性?

分为两个层⾯来说。

  • 从数据库层⾯,数据库通过原⼦性、隔离性、持久性来保证⼀致性。也就是说ACID四⼤特性之中,C(⼀致性)是⽬的,A(原⼦性)、I(隔离性)、D(持久性)是⼿段,是为了保证⼀致性,数据库提供的⼿段。数据库必须要实现AID三⼤特性,才有可能实现⼀致性。例如,原⼦性⽆法保证,显然⼀致性也⽆法保证。
  • 从应⽤层⾯,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!

隔离性

隔离性要求并发执行的事务之间互不干扰。每个事务都感觉像是在单独访问数据库一样,这样可以防止事务之间的读写冲突,保证事务结果的正确性。不同的隔离级别(如读未提交、读已提交、可重复读、串行化)提供了不同程度的隔离保证。

如果无法保证隔离性会发生什么?

脏读

一个事务可以读取到另一个事务尚未提交的数据。如果后者最终回滚了其更改,那么前者读取到的数据就是无效的,这可能导致错误的业务决策或数据不一致。读到了无效数据!

不可重复读

在同一事务中,如果两次读取同一数据,可能会得到不同的结果,因为其他事务在这两次读取之间已经修改并提交了该数据。这违反了用户对数据稳定性的期望。前后两次发生了数据的修改!

幻读

在一个事务内,多次执行同一条查询语句,每次返回的结果集可能会有差异,原因是有其他事务在这期间向表中插入了新行,导致原本不满足条件的记录出现在结果集中。这对于依赖特定数据集合进行计算或判断的事务来说是个问题。前后两次发生了数据的增加或删除!

如何保证隔离性?

  1. 提供事务隔离级别
  • 读未提交(Read Uncommitted):事务可以读取其他未提交事务修改的数据,可能导致脏读。
  • 读已提交(Read Committed):事务只能读取其他已提交事务的结果,避免了脏读,但可能出现不可重复读
  • 可重复读(Repeatable Read):在一个事务内多次读取同一条数据结果是一样的,避免了不可重复读,但可能遇到幻读问题。
  • 串行化(Serializable):最严格的隔离级别,通过串行执行事务或者使用更高级的锁机制来避免所有并发问题,包括脏读、不可重复读和幻读,但性能开销最大。
  1. 并发控制
  • 锁机制:包括行锁、表锁、页锁等。通过在事务访问数据前加锁,阻止其他事务修改或读取,直到当前事务结束释放锁。锁的类型和粒度会影响并发性能。
  • 多版本并发控制(MVCC, Multiversion Concurrency Control):允许多个事务读取同一份数据的不同版本,而不会相互阻塞。每个事务看到的是基于事务开始时刻数据的一个快照,从而避免了读写冲突,广泛应用于如PostgreSQL、MySQL的InnoDB引擎中。
  • 时间戳排序:为事务分配时间戳,事务按照时间戳顺序执行,以避免冲突。
  • 乐观锁与悲观锁:乐观锁假设并发冲突较少,仅在提交时检查数据是否被修改;悲观锁则假定会发生并发冲突,提前加锁防止修改。

持久性

持久性意味着一旦事务被提交,它引起的数据变化就会永久保存在数据库中,即使发生系统崩溃或电源故障等意外情况,这些改变也不会丢失。

如何保证持久性?

持久性主要通过redo log(重做日志)来实现。每当数据库中的数据发生变化时,数据库系统首先将这些变化记录到事务日志中。事务日志通常是顺序写入磁盘上的非易失性存储介质(如HDD或SSD),以确保即使在系统崩溃或电源故障的情况下,数据的修改操作仍能被追踪并恢复。在事务提交前,其相关日志会被标记为“已准备好提交”。如果发生故障,系统重启后可以通过重做(redo)日志将未完全写入数据库的数据操作完成,从而恢复到一致状态。

意外情况

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

怎么解决?

使用预写日志!在实际修改数据库之前,先将修改记录写入日志中。这样即使在修改数据和更新内存与磁盘之间发生故障,也能根据日志恢复到一致状态。

标签:事务,隔离,数据库,回滚,特性,保证,MySQL,数据
From: https://blog.csdn.net/weixin_51332735/article/details/139112558

相关文章

  • MYSQL分页优化
    分布式任务调度内的MySQL分页查询优化 作者:vivo互联网数据库团队- QiuXinbo本文主要通过图示介绍了用主键进行分片查询的过程,介绍了主键分页查询存在SQL性能问题,如何去创建高效的索引去优化主键分页查询的SQL性能问题。对于数据分布不均如何发现,提供了一些SQL查询案......
  • 深入《MySQL视图》及《MySQL索引与分区》
    一. MySQL视图#MySQL视图深度指南:从新手到专家欢迎来到这篇全面的MySQL视图教程。在数据库的世界中,视图(View)是一个强大的工具,它允许你以一种安全且用户友好的方式操作数据。本篇博文将带你了解什么是视图、如何创建它们,以及如何有效地使用视图来简化你的数据库操作。##什......
  • mysql 中索引类型有哪些,以及对数据库的性能的影响?
    索引类型普通索引:允许被索引的数据列包含重复的值唯一索引:可以保证数据记录的唯一性主键索引:是一种特殊的唯一素引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字primarykey来创建联合索引:索引可以覆盖多个数据列全文索引:通过建立倒排索引,可以极大......
  • 分布式任务调度内的 MySQL 分页查询优化
    作者:vivo互联网数据库团队- QiuXinbo本文主要通过图示介绍了用主键进行分片查询的过程,介绍了主键分页查询存在SQL性能问题,如何去创建高效的索引去优化主键分页查询的SQL性能问题。对于数据分布不均如何发现,提供了一些SQL查询案例来进行参考,对MySQLIndexConditionPushdown......
  • mySql 存储过程与函数
    过程CREATEDEFINER=`root`@`%`PROCEDURE`clearDate_Jk`()LANGUAGESQLNOTDETERMINISTICCONTAINSSQLSQLSECURITYDEFINERCOMMENT''BEGINDELETEFROMsys_deptWHEREcreate_time>'2023-12-31';truncatetablesys_file;ENDCREAT......
  • MySQL大师课:36秘技解锁数据库性能与管理新高度?
     ......
  • Linux安装卸载MySQL
    大家好,我是Java陈序员。今天,给大家分享下在Linux环境中如何安装卸载MySQL.关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。MySQL安装准备一台Linux服务器下载Linux版MySQL安装包下载地址:https://downloads.m......
  • MySQL 的慢 SQL 优化方案
    索引可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。一、导致SQL执行慢的原因1.硬件问题。如网络速度......
  • MySQL-10.索引优化与查询优化
    C-10.索引优化与查询优化都有那些维度可以进行数据库调优?简言之:索引失效,没有充分利用到索引--索引建立关联查询太多JOIN(设计缺陷或不得已的需求)--SQL优化服务器调优及各个参数设置(缓冲,线程数等)--调整my.cnf数据过多--分库分表关于数据库调优的知识点非常分散......
  • mysql中索引的使用
    大家好,我们知道创建索引是要付出时间和空间的代价的,只有合理的创建索引才能提高查询效率。今天我们来聊一聊如何优雅的,合理的使用索引。上篇文章我们讲到了在索引在where查询过程中是如何发挥作用的,今天我们再谈谈索引在排序和分组的时候是如何使用的。为了方便讲解,我们依......