2023.12.7 关于 MySQL 事务详解

目录

事务的四大特性

原子性

一致性

持久性

隔离性

事务并发执行

脏读

不可重复读

幻读

四个隔离级别 

read uncommitted

read committed

repeatable read

serializable


事务的四大特性

原子性

  • 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节
  • 事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从未发生过一样

一致性

  • 指在数据库事务执行的过程中,系统从一个一致的状态转移到另一个一致的状态
  • 一致性确保了数据库的完整性和业务规则的正确性

实例理解

  • 银行转账事务
  • 如果在事务执行前,两个账户的总和是 1000 元,那么在事务执行后,两个账户的总和应该仍然是 1000 元
  • 这确保了在任何时刻,数据库都处于合法、符合业务规则的状态

持久性

  • 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

注意:

  • 事务在执行的时候,会把执行的过程先记录到硬盘上,再执行要进行的操作(该记录不会随着断电而丢失)
  • 如果一个事务执行到一半 断电了!
  • 等到下次重启的时候,此时 mysql 就会感知到,上个事务这里执行到了中间状态
  • 就会根据之前记录的执行过程,进行回滚了!

隔离性

  • 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
  • 事务隔离分为不同级别,包括读未提交、读提交、可重复读、串行化

事务并发执行

  • Mysql 是一个关系型数据库管理系统,其本体为数据库服务器,该服务器负责存储、管理、处理数据,并提供了一套 sql 语言接口供客户端与之交互
  • 客户端通过连接到 Mysql 服务器,可以向服务器发送 sql 语句
  • 事务是由一组 sql 语句组成的逻辑工作单元,它要么全部执行成功,要么全部失败回滚,事务通过执行 sql 语句来对数据库进行读取和更新操作
  • 在多用户的数据库环境中,多个客户端可以同时连接到数据库服务器,并发送各自的事务请求,这就是并发执行,即多个事务可以同时在数据库中执行

  • 多个事务同时操作数据库时可能会发生下述三种问题

脏读

  • 脏读发生在一个事务读取了另一个事务还未正式提交的数据,因为存在回滚的可能性

实例理解

解决方法

  • 给正在被修改的字段加上 


不可重复读

  • 不可重复读发生在一个事务内的两次读取之间,另一个事务修改了数据,导致两次查询结果不一致

实例理解

解决方法

  • 给正在被查询的字段加上 


幻读

  • 幻读发生在一个事务内的两次查询之间,另一个事务插入或删除了数据,导致两次查询结果不一致

实例理解

解决方法

  • 加上读锁 无法解决幻读问题,因为读锁仅作用于被查询的字段,无法被其他事务修改其字段值

  • 使用串行化的方式才能解决该问题,即事务必须 串行 执行,不能 并行 执行

四个隔离级别 

  • Mysql 提供了四个隔离级别

read uncommitted

  • 对事务的并发执行不做任何限制
  • 其并发程度最高,隔离性最低
  • 会产生脏读、不可重复读、幻读的问题

read committed

  • 对写操作加锁
  • 并发程度降低了,隔离性提高了
  • 解决了脏读的问题,任然存在不可重复读、幻读的问题

repeatable read

  • mysql 的默认隔离级别
  • 对写和读都加锁了
  • 并发程度又降低了,隔离性又提高了
  • 解决了脏读、不可重复读的问题,任然存在幻读问题

serializable

  • 严格串行化
  • 并发程度最低(串行执行),隔离性最高
  • 解决了脏读、不可重复读、幻读的问题

注意:

  • 从上到下
  • 隔离性依次增高
  • 并发性依次降低
  • 执行速度依次降低
  • 数据可靠性依次提高

总结:

  • 在实际的开发中就可以根据当前要解决的问题的需求场景,来决定使用哪个隔离级别
  • 如果涉及到 金钱交易 这样的场景,就可以让让并发性低一点,隔离性高一点,以提高精准度
  • 如果涉及到 统计点赞数、浏览量 这样的场景 ,就可以让并发性高一点,隔离性低一点,以提高效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/258828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIT线性代数笔记-第26讲-复习二

目录 26.对称矩阵及正定性打赏 26.对称矩阵及正定性 实对称矩阵的特征值均为实数,并且一定存在一组两两正交的特征向量 这对于单位矩阵显然成立 证明特征值均为实数: ​    设一个对称矩阵 A A A,对于 A x ⃗ λ x ⃗ A \vec{x} \lambda…

Pipenv环境配置+Pytest运行

环境配置 使用Pipenv进行虚拟环境管理,Pipfile为依赖模块管理文件。 安装pipenv:brew install pipenv根项目根目录下执行命令创建虚拟环境: pipenv install在Pycharm中指定项目运行的虚拟环境 :File->Settings->Project:-…

好莱坞明星识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则表达式定义 )

【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式的开发手册 前提介绍正则表达式正则表达式的历史正则表达式的定义正则表达式的组成普通字符非打印字符特殊字符限定符限定符案例分析贪婪匹配/非贪婪匹配方式 定位符选择组合符后向引用 总结心得 前提…

5.10 Windows驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能的实现一般可在应用层进行,而驱动层只需要保留一个读写字节的函数即可…

[⑦ADRV902x]: JESD204学习笔记

前言 JESD204B/C基于SERDES(SERialization/DESerialization)技术,也就是串化和解串,在发送端将多位并行的数据转换为1 bit的串行数据,在接收端将串行数据恢复成原始的并行数据。 在JESD204接口出现以前,数…

stm32串口编程实例-实现数据的收发功能

大家好,今天给大家介绍stm32串口编程实例,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 串口是USART(通用同步/异步收发器)的俗称。 实际上,串行总线并不…

git常用命令指南

目录 一、基本命令 1、创建分支 2、切换分支 3、合并分支 4、初始化空git仓库 二、文件操作 1、创建文件 2、添加多个文件 3、查看项目的当前状态 4、修改文件 5、删除文件 6、提交项目 三、实际操作 1、创建目录 2、进入新目录 3、初始化空git仓库 4、创建文…

C 语言 变量

变量初始值 全局变量:初始值是 0 局部变量:初始值是 随机的 类型限定符 通常不需要显式使用 register 关键字来优化变量的存储和访问。 关键字 _Complex和_Imaginary分别用于表示复数和虚数(二者皆是数学概念) 变量的声明和定义 c…

计算机方向的一些重要缩写和简介

参考: 深度学习四大类网络模型 干货|机器学习超全综述! 机器学习ML、卷积神经网络CNN、循环神经网络RNN、马尔可夫蒙特卡罗MCMC、生成对抗网络GAN、图神经网络GNN——人工智能经典算法 MLP(Multi Layer Perseption)用在神经网络中…

LeetCode Hot100 78.子集

题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 方法:灵神 选 or 不选 class Solution {private final List&…

c语言实例:计算并输出一个整数数组的平均值

大家好,今天给大家介绍一个c语言实例:计算并输出一个整数数组的平均值,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 以下是一个使用C语言实现的实例&am…