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.mzph.cn/news/207716.shtml

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

相关文章

Java数据结构之《链式二叉树的创建及遍历》(难度系数100)

一、前言: 这是怀化学院的:Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题…

视频剪辑:视频转码实用技巧,批量将MP4转为MP3音频

随着数字媒体设备的普及,视频和音频文件已成为日常生活中的重要组成部分。有时,可能要将MP4视频文件转换为MP3音频文件,以提取其中的音频内容或者进行其他处理。这是耗费时间的任务,那要如何操作呢?本文详解云炫AI智剪…

教你pycharm运行Django第一个项目

文章目录 前言搭建Django:1.新建Django项目:2.为Django项目指定远程中创建的虚拟环境下的python解释器:3.配置ubuntu的端口转发(添加端口号为1234的端口):关于Python技术储备一、Python所有方向的学习路线二、Python基…

循环单向链表与约瑟夫问题

循环链表介绍 先不急着看约瑟夫问题是什么,先了解循环链表的结构,那什么是循环链表? 循环,顾名思义,从链表中第一个节点出发,还会遇到第一个节点,形成循环的一环。也就是说链表中最后一个节点…

python 使用 watchdog 实现类似 Linux 中 tail -f 的功能

一、代码实现 import logging import os import threading import timefrom watchdog.events import FileSystemEventHandler from watchdog.observers import Observerlogger logging.getLogger(__name__)class LogWatcher(FileSystemEventHandler):def __init__(self, log_…

《opencv实用探索·十五》inRange二值化图像

opencv接口如下: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函数实现二值化功能,主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色&am…

一篇文章带你快速入门 Nuxt.js 服务端渲染

1. Nuxt.js 概述 1.1 我们一起做过的SPA SPA(single page web application)单页 Web 应用,Web 不再是一张张页面,而是一个整体的应用,一个由路由系统、数据系统、页面(组件)系统等等&#xff0…

HbuilderX使用Uniapp+Vue3安装uview-plus

如果你是vue2版本想使用uniapp去配置uviewui库可以参考之前的文章 小程序的第三方ui库推荐较多的还是uview的,看起来比较美观,功能也比较完善,下面将提一下Vue3安装uview-plus库的教程 创建项目 安装 首先进入官网 uView-Plus 直接下载并导…

预训练--微调

预训练–微调 一个很简单的道理,如果我们的模型是再ImageNet下训练的,那么这个模型一定是会比较复杂的,意思就是这个模型可以识别到很多种类别的即泛化能力很强,但是如果要它精确的识别是否某种类别,它的表现可能就不…

07-2 Python模块和命名空间

1. 模块 概念:其实就是一个Python文件,正常文件有的变量,函数,类,模块都有 功能:模块可以被其它程序引入,以使用该模块中的函数等功能。 示例:test-module.py调用mymodule.py模块中的now_time…

一篇文章带你快速入门 Vue 核心语法

一篇文章带你快速入门 Vue 核心语法 一、为什么要学习Vue 1.前端必备技能 2.岗位多,绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能(Vue2Vue3) 二、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) …

Mysql 日期函数大全

一、时间函数 (一)、获取当前时间 1、NOW() 获取当前日期和时间,在程序一开始执行便拿到时间 返回格式 YYYY-MM-DD hh:mm:ss eg: NOW() 得到 2023-12-03 12:20:02 NOW(),SLEEP(2),NOW() 得到 2023-12-03 12:20:02 | 0 | 2023-…

目标检测——OverFeat算法解读

论文:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 作者:Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun 链接:https://arxiv.org/abs/1312.6229 文章…

SpringAOP专栏二《原理篇》

上一篇SpringAOP专栏一《使用教程篇》-CSDN博客介绍了SpringAop如何使用,这一篇文章就会介绍Spring AOP 的底层实现原理,并通过源代码解析来详细阐述其实现过程。 前言 Spring AOP 的实现原理是基于动态代理和字节码操作的。不了解动态代理和字节码操作…

【C语言】函数递归详解(一)

目录 1.什么是递归: 1.1递归的思想: 1.2递归的限制条件: 2.递归举例: 2.1举例1:求n的阶乘: 2.1.1 分析和代码实现: 2.1.2图示递归过程: 2.2举例2:顺序打印一个整数的…

机器学习---集成学习的初步理解

1. 集成学习 集成学习(ensemble learning)是现在非常火爆的机器学习方法。它本身不是一个单独的机器学 习算法,而是通过构建并结合多个机器学习器来完成学习任务。也就是我们常说的“博采众长”。集 成学习可以用于分类问题集成,回归问题集成&#xff…

多线程并发Ping脚本

1. 前言 最近需要ping地址,还是挺多的,就使用python搞一个ping脚本,记录一下,以免丢失了。 2. 脚本介绍 首先检查是否存在True.txt或False.txt文件,并在用户确认后进行删除,然后从IP.txt的文件中读取IP地…

CSS——sticky定位

1. 大白话解释sticky定位 粘性定位通俗来说,它就是相对定位relative和固定定位fixed的结合体,它的触发过程分为三个阶段 在最近可滚动容器没有触发滑动之前,sticky盒子的表现为相对定位relative【第一阶段】, 但当最近可滚动容…

【MATLAB】tvfEMD信号分解+FFT+HHT组合算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解(TVFEMD)、傅里叶变换(FFT)和希尔伯特-黄变换(HHT)的信号分解方…

电子学会C/C++编程等级考试2021年06月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字变换 给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变换 1. 交换相邻的两个数字 2. 将一个数字加1。如果加1后大于9,则变为0 3. 将一个数字加倍。如果加倍后大于…