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智剪…

TypeScript中泛型对象、泛型类

一. 概览 本文详细介绍泛型中泛型对象和泛型类的使用,结合实际应用场景,加深对泛型的理解、使用。 二. 泛型对象 举个例子 const test {a: 1,b: 1 }一个类型有没有一种可能让我么在定义的时候传入一个类似于变量的形参,在使用的时候传入…

Jtti:香港云服务器如何实现远程连接?

云服务器具有灵活扩展、高可用性、易于管理和数据安全等优点,因此被广泛应用于各种业务场景。然而,对于初次使用云服务器的用户来说,如何实现远程连接可能是一个难题。本文将详细介绍云服务器实现远程连接的步骤和注意事项,帮助用…

教你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…

什么是HTTPS加密协议?HTTPS安全传输原理,SSL和TLS介绍,NGINX如何配置SSL证书

HTTPS介绍 HTTPS是超文本传输协议(HTTP)的安全版本。它使用SSL(安全套接层)或TLS(传输层安全)加密协议来保护数据传输的安全性和机密性,以防止未经授权的访问和窃听。HTTPS协议通常用于处理敏感…

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…

充电桩IC

充电桩IC 电子元器件百科 文章目录 充电桩IC前言一、充电桩IC是什么二、充电桩IC的类别三、充电桩IC的应用实例四、充电桩IC的工作原理总结前言 充电桩IC的设计和功能会根据不同的充电协议和市场需求进行调整和定制。目前市场上有许多不同型号和厂家的充电桩IC可供选择,以满足…

一篇文章带你快速入门 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 文章…

Go语言-让我印象深刻的13个特性

我们正在加速进入云原生时代,Go语言作为云原生的一块基石,确有它的独到之处。本文介绍Go语言的几个让我印象深刻的特性。 1、兼顾开发效率和性能 Go语言兼顾开发效率和性能。可以像Python那样有很快的开发速度,也可以像C那样有很快的执行速…

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:顺序打印一个整数的…