Mysql事务详解配合案例一篇搞定 绝对简单通俗

目录

介绍

实操

自动提交事务

手动提交事务

张飞自减回滚

张飞关羽转账回滚

mysql事务隔离级别

读未提交

读已提交

可重复读

可串行化 


介绍

MySQL的事务处理是数据库管理系统(DBMS)提供的一种机制,用于确保一系列的数据库操作能够作为一个完整的、不可分割的工作单元来执行。事务处理的主要目的是维护数据的完整性和一致性,特别是在高并发或多用户环境中。

事务具有四个关键属性,通常称为ACID特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么一个也不做。如果事务的一部分失败,那么整个事务都将回滚到开始之前的状态,确保数据的完整性。

  2. 一致性(Consistency):事务的执行应该让数据库从一个一致性状态转变到另一个一致性状态。这意味着事务执行前后的数据应该满足所有的约束和业务规则。

  3. 隔离性(Isolation):事务的执行应该是独立的,不受其他事务的影响。即使多个事务同时进行,它们也应该像单独执行一样,不会相互干扰。

  4. 持久性(Durability):一旦事务被提交,它对数据库的改变将是永久的,即使在系统故障后也能恢复。

在MySQL中,事务处理主要通过以下命令控制:

  • START TRANSACTION 或 BEGIN:开始一个新的事务。
  • COMMIT:提交事务,使其更改成为永久的。
  • ROLLBACK:回滚事务,撤销所有未提交的更改。

MySQL的InnoDB存储引擎支持事务处理,而MyISAM等其他引擎则不支持。这是因为InnoDB使用行级锁定和事务日志来支持并发和恢复,而MyISAM使用的是表级锁定,不支持回滚。

事务处理在需要处理复杂业务逻辑、涉及多个表更新的情况下特别重要,比如银行转账、订单处理等场景,它可以确保数据的一致性和安全性。

实操

之前在听别人讲mysql事务时总觉得非常抽象,没有结合一些具体的案例来进行说明,搞得云里雾里的,下面模拟些实际场景来说明mysql的事务

自动提交事务

mysql默认是自动提交事务的,可以查看下mysql的事务提交方式

查看事务提交状态

select @@autocommit;

下面想象一个场景:

有两个人在互相转账或去银行取钱,A首先要查询下自己的余额,然后要转给B 1000块,那么这里是需要手写三个sql

查询A余额sql

减掉A余额sql

增加B余额sql

建表进行模拟数据

 此处模拟张飞转账给关羽1000

此时张飞,关羽都是3000,下面进行转账:

直接选中三条sql一起执行

查看张飞,关羽余额

此时张飞,关羽余额已正确转账

那么如果在前两条sql正确执行后,在执行第三条sql前业务出现某种异常,此时还能正常转账吗.先将两者金额都调整回3000

 直接在第二条sql和第三条sql之间写一些非sql语句来进行模拟异常

全选再次执行

 查看转账结果

此时可以看到张飞减余额成功,但是关羽的余额并没有增加,此时就出现了问题,因为mysql的事务此时是隐式自动 提交的,也就是每条sql都是单独的事务进行提交,三条sql并没有作为一整个事务进行执行,从而导致了这种问题的发生

手动提交事务

我们可以将mysql的事务提交调整为手动提交,然后当事务中的各个sql有异常时进行事务回滚就可以规避前面的问题

调整mysql事务为手动提交

set @@autocommit = 0;

查看事务提交方式

张飞自减回滚

先将张飞减1000

 a点保存点做的事情是将张飞金额减了1000

再进行保存点b

保存点b将金额又减了500

此时事务还没有提交,我们可以根据保存点来进行回退到指定的状态

还可以再回退到a点

注意

如果rollback 没有指定回退的保存点,默认回到第一个保存点

如果有多个顺序保存点  a-->b-->c  ,在rollback时倒序按顺序进行回退时,可以进行逐个回退,但是如果有跳跃点进行回退时,回退到指定的点后不可以再向后回退,只能向前回退 比如:a-->b-->c,进行回退时,可以c-->b-->a,进行回退. 如果是一开始就回退到b点,那么后续就只能向b的前面进行回退,不能再向后回退,如果回退点是b,只能b-->a,不能再向c进行回退,当然如果一开始就回退到了a,那么a后面的b和c就不能再回退了,需要注意回退的顺序

如果进行提交 commit,那么之前的保存点都会失效,不能再进行回退 

张飞关羽转账回滚

下面进行张飞关羽的转账进行事务回滚

 

数据初始化

 

模拟报错,此时还没有进行commit,使用rollback进行回滚数据

 回滚成功

mysql事务隔离级别

查看当前会话的事务隔离级别

 select @@tx_isolation;

 5.8以上版本

select @@transaction_isolation;

读未提交

准备两个连接mysql的会话A 和B

可以看到此时两个会话的隔离级别都是可重复读

将B会话的隔离级别调整为读未提交

set session transaction isolation level read uncommitted;

两个会话分别开启事务

两边查询下当前user表数据

都是相同的三条数据

此时,使用会话A进行新增一条数据:

此时A会话的事务还未提交,接下来看下B会话是否可以查询到

 B会话读取到了A会话未提交事务的数据,此时就会有问题,如果该数据A事务将其回滚或者进行其他操作后再进行事务提交,而B会话读取到了后就将其数据进行查询或者其他操作,那么A的提交肯定会影响到B会话的数据,此时B会话读取到的数据就是脏数据

此时我们继续操作,用A会话进行数据的修改和再新增一条数据

A会话修改数据和新增数据后提交事务 此时B会话查询到了由A会话在进行修改操作并提交后的数据,每次查询造成不同的结果,从而造成了不可重复读

B会话查询到了由A会话再进行新增操作并提交事务后的数据,每次查询造成不同的结果,从而造成了幻读

此时B会话也开启了事务,但是此时B会话的数据却受到了A会话事务的影响,读取到了A事务提交的数据,这就是不合理的,B会话由于开启了事务,此时B会话中的数据就应该是一开始时开启事务时读取到的数据库的数据,不应该收到其他事务的影响

提交B会话事务,开启新的事务进行演示读已提交

读已提交

B会话上一个事务提交后,将B会话的事务隔离级别此时调整为读已提交

set session transaction isolation level read uncommitted;

 两边分别开启新的事务

此时在A会话中进行新增一条数据,但并不提交事务,查看B事务是否还能读取到A事务未提交数据

 可以看到当B会话的事务隔离级别调整为读已提交时,此时B会话读取不到A会话未提交事务的数据了,也就是没有出现脏读的数据

此时再用A会话进行修改数据和新增数据,并进行事务提交,查看B会话事务是否会读取到A会话事务的修改和新增的数据

此时B会话还是读取到了A会话进行提交的修改和新增数据,每次返回了不同的结果集造成了不可重复读和幻读

B会话进行事务提交,调整隔离级别为可重复读,并两边重新开启事务 

可重复读

将B会话前面的事务将提交后,B会话的隔离级别调整为可重复读

set session transaction isolation level repeatable read;

两边都开启事务

先确定下此时两个会话都查询到的初始数据

此时,再使用A会话进行新增数据,修改数据后进行提交,然后使用B会话查看是否能查询到A会话的事务提交数据

 

可以看到此时B会话事务查询到的还是之前的原始数据,没有受到A事务的影响,没有出现脏读,不可重复读和幻读

可串行化 

将前面两个事务进行提交,然后将B会话的事务隔离级别调整为可串行化

设置B会话事务隔离级别为可串行化

set session transaction isolation level serializable;

可串行化会对会话事务进行加锁,也就是当B事务进行查询数据表或者修改操作时 它会查看是否有其他事务正在操作表,如果有会进行加锁,卡在那里不动.知道其他事务进行提交后再进行操作

使用A会话进行新增数据或者查询数据,然后此时不提交,使用B会话进行查询数据,观察B会话变化

 可以看到A会话进行操作后未提交事务时,用B会话进行数据查询,此时光标卡着不动了,因为已经被事务加锁了,而A事务进行提交后B 会话立马查询到了A会话提交的数据,解决了脏读,不可重复读和幻读

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微软的这个按钮又双叒叕变了位置?有时候还不见了……

前言 小白最近打开Windows11系统的时间比较少,大部分时间都还是喜欢用MacBookPro码字。 之前小白写过一篇关于微软系统左下角的这个神奇按钮 Windows11更新之后,电脑左下角多出了一个奇怪的按钮(点我跳转查看) 没错&#xff0…

MCK主机加固:智能科技,构筑网络安全的铜墙铁壁

在数字化转型的浪潮中,企业服务器的安全已成为维护业务连续性和保护数据资产的关键。MCK主机加固产品,以其创新技术,为企业提供了一个全面、智能、高效的安全解决方案。 一、智能安全监测 MCK主机加固产品采用深度学习算法,能够…

20240611在飞凌OK3588-C核心板的Linux系统下打通UART0和UART3

20240611在飞凌OK3588-C核心板的Linux系统下打通UART0和UART3 2024/6/11 7:45 Z:\OK3588_Linux_fs\kernel\arch\arm64\boot\dts\rockchip\OK3588-C-common.dtsi &pinctrl { m2 { net_m2_rst_gpio: net_m2_rst_gpio { rockchip,pins <1 RK_PC6 RK_…

Redis实战篇4:发布博客与点赞

一、博客 关于发布博客这个功能&#xff0c;他就是mysql相关的数据库&#xff0c;不涉及到redis&#xff0c;但是我们可以来看一下其相关的表的功能来了解一下&#xff1a; 博客表&#xff1a; 与其对应的评论表&#xff1a; 关于其数据库的设计也应该好好的学习一下。 二…

RKNNToolkit2 推理数据输入问题

RKNNToolkit2 推理数据输入问题 ​ 以前在玩RKNN的时候&#xff0c;下载对应的模型时&#xff0c;由于众多大佬帮忙开源了自己准好的模型和写好的各种后处理&#xff0c;所以当时只要脚本能运行&#xff0c;就不去深究代码的内容和模型。由于最近任务的调整&#xff0c;也慢慢…

ssm职工健康素养数据管理系统设计与实现-计算机毕业设计源码45392

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对职工健康素养数据管理系统等问题&#xff0…

【PowerDesigner】PDM生成REPORT

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. PDM生成REPORT &#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用PowerDesigner的…

6、后端项目初始化

打开idea后&#xff0c; New Project &#xff0c;用Maven构建 Spring Boot 项目 点击Next后&#xff1a;先勾选两个基本的依赖&#xff0c;后面再手动添加其它需要的依赖 Spring Web: 表示是一个web应用程序 Lombok&#xff1a;写实体类的时候添加Data注解后就会自动加上g…

Windows 10 中添加 开机启动 自动运行的程序

Win R 输入 “shell:startup” &#xff0c;回车确定 把 应用的 快捷方式 复制到文件夹中。就会自动开机启动了 参照图&#xff1a;

pdf怎样在线修改大小?压缩pdf文件大小的步骤

现在pdf是提供内容预览常用的一种方式&#xff0c;有很多的信息都会用这种文件格式来存储&#xff0c;当pdf的内容比较多的时候&#xff0c;相对而言生成的文件也会比较大&#xff0c;在上传使用的时候会受到影响&#xff0c;那么有什么方法能够快速调整pdf文件大小呢&#xff…

Spark学习——不同模式下执行脚本

举个简单的例子&#xff1a;使用spark官方用例"取pi值" 一、local模式 进入spark目录执行后台命令&#xff1a; bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[*] \ ./examples/jars/spark-examples_2.12-3.2.1.jar \ 10运行结…

opencv_核心操作

图像基本操作 访问和修改像素值 import numpy as np import cv2 img cv2.imread(c:/Users/HP/Downloads/basketball.png) h,w,c img.shape #图像大小 print(h,w,c)### 841 1494 3# 通过行和列坐标访问像素值 img[100,100]### 231 ### array([231, 140, 146], dtypeuint8)# …

STM32移植Easylogger输出

简介 EasyLogger 是一款超轻量级 、高性能的 C 日志库&#xff0c;非常适合对资源敏感的软件项目&#xff0c;例如&#xff1a;IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C 日志库&#xff0c;EasyLogger 的功能更加简单&#xff0c;提供给用户的接口…

如何更改 Windows 默认下载位置?按照以下步骤操作

大家在使用电脑的过程中常常需要下载一些文件等资源&#xff0c;但是一般没有修改时电脑下载资源之后都默认存放在了 C 盘&#xff0c;这也导致 C 盘的空间越来越小。我们可以提前修改电脑的默认下载位置&#xff0c;下面一起来看一看默认下载位置怎么更改。 修改浏览器默认下…

英伟达SSD目标检测代码解析

一、官方原代码 #!/usr/bin/env python3 # # Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Softwa…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

Linux内核编程(一)内核模块基础

本文目录 前述&#xff1a;内核框架图一、Linux 内核模块概述二、Linux 模块的优点三、知识点1. GPL开源协议2. 查看已安装的模块文件&#xff1a;lsmod 四、常用API1. 入口函数2. 出口函数3. 声明驱动模型出/入口函数4. printk内核输出函数 五、内核源码头文件六、编写内核模块…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端&#xff1b;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置&#xff08;很麻烦跟着输就行&#xff09; 继续 出现如上…

电脑想加个WIFI功能,怎么选!

在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…

NVIDIA Jetson AI边缘计算盒子

这里写自定义目录标题 烧录系统安装Jetpack 烧录系统 选择一台Linux系统&#xff0c;或者VMware的电脑作为主机&#xff0c;烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的&#xff0c;暂时还没验证官方烧录&#xff08;后续验证补充&#xff09;。 安装Jetpac…