首页 > 数据库 >Mysql是如何实现事务的?

Mysql是如何实现事务的?

时间:2024-10-08 22:11:51浏览次数:7  
标签:事务 读取 幻读 如何 提交 Mysql 数据 重复

Mysql是如何实现事务的?

MySQL 通过以下几种机制实现事务管理,确保数据的一致性和完整性:

1.ACID属性

  • 原子性(Atomicity):事务要么全部成功,要么全部失败。

  • 一致性(Consistency):事务开始和结束时,数据库的状态必须保持一致。

  • 隔离性(Isolation):多个事务并发执行的时候,一个事务的操作对其他事务是不可见的。

  • 持久性(Durability:事务提交后,结果将入库保存,并写入RedoLog。

2.事务日志

  • RedoLog(重做日志):记录事务提交的更改。

  • UndoLog(回滚日志):记录回滚事务未提交的更改。

3.锁机制

行级锁、表级锁控制并发访问修改,保证其他事务无法修改锁定的数据,实现隔离性。

4.隔离级别

隔离级别是为了解决并发事务中可能遇到的三个数据问题。

  1. 脏读:事务读取到其他事务未提交的数据。

  2. 不可重复读:一个事务中第一次读取一个数据,第二次再次读取可能不一致,因为其他事务可能提交了新数据。

  3. 幻读:一个事务两次查询之间,其他事务新增了符合条件的行,导致了查询结果的变化,这就是幻读。

  • 读未提交:事务可以读取其他事务未提交的数据,存在脏读。

  • 读已提交:事务只能读取到已提交的数据,解决脏读,出现不可重复读。

  • 可重复度读:事务执行期间数据可重复读取,解决不可重复度,可能出现幻读。

  • 串行化:事务排队执行,解决幻读。

性能由高到低,安全性由低到高。

注:在传统数据库系统中,可重复读隔离级别虽然防止了脏读和不可重复读,但仍然可能出现幻读。然而,MySQL 采用了 InnoDB 存储引擎的机制,使得可重复读可以避免幻读。

MySQL 的 InnoDB 存储引擎通过以下两种机制来防止幻读:

  • Next-Key Lock(当前读):这种锁是行锁和间隙锁的组合。它不仅锁住了表中的现有记录,还锁住了记录之间的“间隙”(gap),以防止其他事务在间隙中插入新记录。例如,当事务 T1 查询某个范围的数据时,InnoDB 会锁住这些数据所在的范围和范围之间的间隙,防止其他事务在查询的结果集范围内插入新记录。这就避免了幻读的发生。

  • 一致性视图(快照读:MVCC,多版本并发控制):MySQL 使用多版本并发控制 (MVCC),在事务开始时生成一个一致性快照,事务在执行过程中会使用这个快照读取数据,确保多次读取时返回的结果一致。即使其他事务插入了新记录,当前事务仍会基于它启动时的快照来读取数据,而看不到其他事务的修改或插入。

标签:事务,读取,幻读,如何,提交,Mysql,数据,重复
From: https://www.cnblogs.com/hwjShl/p/18453162

相关文章

  • Android应用如何进行网络优化
    在Android应用中,可以从以下几个方面进行网络优化:一、连接管理1.使用连接池如前面提到的OkHttp连接池,合理配置连接数,复用连接以减少连接建立的时间和资源消耗。2.保持连接的有效性监测网络状态变化,当网络从断开状态恢复时,检查并恢复可能被中断的连接。对于长时间无数......
  • 如何把 Word 中的图片导出?轻松地将图片从word导出来的6个方法
    在Word中高效提取图片的方法有哪些?在日常办公和学习中,Word文档作为我们处理文字、排版及插入多媒体元素的重要工具,扮演着不可或缺的角色。其中,图片作为直观展示信息的手段,频繁出现在各类文档中。然而,随着文档内容的日益丰富,有时我们可能需要从复杂的Word文档中高效地提取出图......
  • mysql join语法解析
     MySQL支持以下JOIN语法用于SELECT语句和多表DELETE和UPDATE语句中的table_references部分:table_references:查询中涉及的一个或多个表的引用,可以是简单表名或JOIN表达式的组合。escaped_table_reference[,escaped_table_reference]...escaped_table_ref......
  • MySQL【一】
    数据库基础知识基础概念介绍数据库:数据库(DataBase简称DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 数据库管理系统: 数据库管理系统(DatabaseManagementSystem简称DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库......
  • 如何入门STM32单片机编程
    入门STM32单片机编程需要掌握以下内容:STM32的基本概念和特点:了解STM32系列单片机的特点、硬件结构、功能模块以及常用的开发工具和资源。KeilMDK开发环境的安装和使用:KeilMDK是一款非常常用的STM32开发工具,通过安装和配置KeilMDK,可以进行STM32的编译、下载和调试操作。......
  • 通过sysbench工具实现MySQL数据库的性能测试
    1.背景 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试。sysbench支持的测试有CPU运算性能测试、内存分配及传输速度测试、磁盘IO性能测试、POSIX线程性能测试、互斥性测试测试、数据库性能测试(OLTP基准测试)。目前支持的数据库主要是My......
  • 如何在VSCode上运行C/C++代码
    诸神缄默不语-个人CSDN博文目录我是Win10,其他系统仅供参考。文章目录1.下载所需插件2.安装编译器3.不借助编辑器的cpp代码执行3.建立VSCodecpp项目3.1c_cpp_properties.json3.2settings.json3.3tasks.json4.运行C++代码参考资料1.下载所需插件2.安装......
  • 【MYSQL】MYSQL约束-----非空约束(not null)和唯一约束(unique)
    1、概念MYSQL非空约束(notnull),指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库就会报错。注意:非空约束一张表中可以有多个。2、语法方式1:在创建表时指定(常用)<字段名><数据类型>not null例如:create table  t_user(i......
  • 免费送源码:Java+spring boot+MySQL springboot社区快递代取服务系统 计算机毕业设计原
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对社区快递代取服务系统等问题,对社区快递代取服务系统进行研究分析,然后开发设计出社区快递代......
  • MySQL慢查询优化&缩容实践
    索引调整在一个数据量较大的订单表中,发现某些查询因为缺少合适的索引而变慢。添加了必要的索引后,查询效率明显提升。查询条件调整在一个sql中需要根据时间条件查询,但是等号左边的字段使用了函数操作(将时间戳转换成了年月日),导致索引失效进行了全表扫描。解决:将等号右边的条件反......