当前位置: 首页 > news >正文

MySQL事务原理-相关日志

文章目录

  • 前言
  • 一、什么是事务?
    • 1.1 事务概念
    • 1.2 事务的四大特性
    • 1.3 事务的隔离级别
  • 二、实现原理
    • 2.1 TODO
    • 2.2 TODO

前言

事务是由MySQL的引擎来实现的,通过show engines命令查看MySQL存储引擎类别,观察只有InnoDB存储引擎支持事务。

在这里插入图片描述

一、什么是事务?

1.1 事务概念

事务(Transaction)是一系列的数据库操作,这些操作要么全部成功执行,要么全部回滚(即全部失败,回到操作前的状态),这样确保数据库的数据在并发访问的情况下保持一致性和完整性。

1.2 事务的四大特性

一个完整的事务必须具备四个条件,这四个条件我们称为ACID,ACID特性确保了一个完整的事务在数据库中的正确执行和数据的一致性。ACID这四个字母,每个字母代表了一个特性。

原子性(Atomicity): 事务(transaction)被视为一个不可分割的单元,要么全部执行成功,要么全部不执行。如果在事务的执行过程中发生错误,那么事务会被回滚到开始前的状态,保持数据的一致性。

一致性(Consistency): 事务在执行前和执行后,数据库的数据应该处于一致的状态。这意味着事务在执行时,必须遵守一些预定的规则或约束,以保持数据的正确性。

隔离性(Isolation): 事务之间是相互隔离的,一个事务的执行不会被其他事务干扰。这意味着并发执行的事务不会相互影响,可以保证数据的完整性和正确性。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

持久性(Durability): 一旦事务成功提交,对数据库的修改将永久保存,即使在系统故障或崩溃后,数据也不会丢失。持久性确保数据的持久性存储,保障数据的可靠性。

1.3 事务的隔离级别

事务隔离级别的主要目的是解决数据库并发访问时可能出现的以下问题:

  1. 脏读(Dirty Read): 一个事务读取了另一个事务尚未提交的数据,如果另一个事务回滚,则读取到的数据实际上是无效的,这种现象就被称为脏读。

  2. 不可重复读(Non-repeatable Read): 在同一个事务内,由于其他事务对同一行数据进行了修改(更新或删除),导致在多次读取该行数据时,得到的结果不一致。这意味着同一个事务内的两次读取操作得到了不同的数据值。重点在于其他事务的更新(update)和删除(delete)。

  3. 幻读(Phantom Read): 在同一个事务内,由于其他事务对数据进行了插入(insert)或删除(delete)操作,导致多次查询时得到的结果集不一致。幻读主要发生在范围查询中,即同一个事务内的两次查询得到了不同数量的结果行。重点在于其他事务的插入(insert)和删除(delete)。

为解决以上问题可以通过设置不同的事务隔离级别,可以控制这些问题的发生概率。MySQL支持以下四种事务隔离级别:

  1. 读未提交(Read uncommitted): 最低级别的隔离,允许一个事务读取另一个事务尚未提交的数据。这可能导致脏读、不可重复读和幻读问题。

  2. 读已提交(Read Committed): 允许一个事务读取另一个事务已提交的数据,解决了脏读问题。但是仍可能出现不可重复读和幻读问题。

  3. 可重复读(Repeatable Read): 这是MySQL InnoDB引擎的默认隔离级别,保证在一个事务内多次读取同一数据时,结果始终一致。解决了脏读和不可重复读问题。但是仍可能出现幻读问题。

  4. 串行化(Serializable): 最高级别的隔离,确保同时只有一个事务能够访问数据,解决了脏读、不可重复读和幻读问题。但是串行化会导致并发性能大幅下降,因为多个事务无法同时访问数据。

隔离级别以及可能产生的读现象:

隔离级别脏读不可重复读幻读
串行化不会发生不会发生不会发生
可重复读不会发生不会发生可能发生
读已提交不会发生可能发生可能发生
读未提交可能发生可能发生可能发生

应结合实际的业务需求,可以选择适合的隔离级别来处理数据并发操作。隔离级别越高,性能可能越差,因为它需要锁定更多的资源以保证数据的一致性。因此,在设计事务时,需要综合考虑业务的要求和性能的影响。

二、实现原理

2.1 TODO

2.2 TODO

http://www.lryc.cn/news/292519.html

相关文章:

  • 内核Oops的几种定位方法
  • 外包干了10个月,技术退步明显.......
  • 2024美赛C完整思路
  • Backtrader 文档学习- Broker - Cheat-On-Open
  • 基于微信浙江杭州某停车场车位预约小程序系统设计与实现 研究背景和意义、国内外现状
  • 编程流程图
  • 2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)
  • 【python接口自动化】- 正则用例参数化
  • Java中的四种线程池详解及使用场景
  • Google Chrome 常用的几个参数
  • Keil软件某些汉字输出乱码,0xFD问题,51单片机
  • 自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人
  • Android中 Gradle与 AGP 版本对应关系表
  • Linux基础知识合集
  • 跟着pink老师前端入门教程-day13
  • go语言基础之泛型
  • Vue.js 中子组件向父组件传值的方法
  • 数据可视化 pycharts实现地理数据可视化(全球地图)
  • Mac下查看、配置和使用环境变量
  • 虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆
  • 如何隐藏Selenium特征实现自动化网页采集
  • springboot149智慧图书管理系统设计与实现
  • 3D词云图
  • opencv-python 视频读取: VideoCapture.get()参数详解
  • python封装的.exe文件是如何在cmd中获取.xml路径的?
  • 【学网攻】 第(18)节 -- 网络地址转换动态NAT
  • nosql数据库期末考试知识点总结
  • 字节大佬含泪吐血总结系列之 《计算机网络》(谢希仁)
  • 多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测
  • Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)