MySQL事务、四大原则、执行步骤、四种隔离级别、锁、脏读、脏写等

MySQL事务

  • MySQL事务
      • 1.什么是事务?
      • 2.事务的四大原则
      • 3.事务执行的步骤
      • 4、事务的隔离性
      • 5、MySQL中的锁

MySQL事务

模拟一个转账业务:

在这里插入图片描述

上图中的sql语句:
update from table set money = mongey - 100 where name = 'A';
update from table set money = mongey + 100 where name = 'B';

但是如果将A姓名或转B姓名写错就会出现,A的金额减掉了,但是B未增加;或者是A的金额未减掉了,但是B增加了,这样就造成了数据库中数据不一致;而事务恰好能解决这个问题。

1.什么是事务?

事务(Transaction):就是将一组sql语句放在同一批次内执行,如果出现sql语句执行错误,则该批次内的所有sql都将取消执行。MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。

事务的特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会操作失败,数据库数据就会回滚到该事务开始之前的状态。

2.事务的四大原则

  • 原子性

数据库中的事务执行作为原子粒度,要么都执行成功,要么都不成功,不存在执行部分成功,部分失败的情况。

  • 一致性

一致性是指事务在执行开始之前和结束之后,数据库的完整性约束没有被破坏,至于中间的过程就没有强行规定,只强调初始状态和结束状态。

  • 隔离性

事务的执行是互不干扰的,一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事物之间不能互相干扰;数据库通过加锁来保证事物之间的隔离性。

  • 持久性

持久性是指,事务执行成功后,无论是提交还是回滚,对数据库中的数据改变都是持久性的。

3.事务执行的步骤

步骤一:关闭MySQL的自动提交(MySQL默认开启的是自动提交;1开启;0关闭)
set autocommit = 0;
步骤二:开启一个事务,标记事务的起始点
start transaction;
步骤三:执行一组sql语句update salary set salary = salary + 500 where Sname = '张三';update salary set salary = salary - 500 where Sname = '李四';
步骤四或步骤五:向数据库提交事务操作
commit;	
步骤四或步骤五:将事务回滚,所有的数据库操作被取消,数据将回到最初的状态。
rollback;
步骤六:开启MySQL自动提交
set autocommit = 1;

这样就解决了上面转账的问题,只有当A和B都执行成功的时候然后再commit,数据才会被保存进数据库中;有错误rollback数据就会回到初始状态。但是注意,回滚或者提交是人主观控制,有sql语句未执行是主观判断可以提交也是可以的;所有都正确执行是也可以选择回滚。

4、事务的隔离性

事务的隔离性:为了让不同的事物之间不存在相互干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一数据的事务相互分离开,让操作之间分开有序的执行。

实现事务隔离的方式:通常数据库都是采用锁的机制,保证事务之间的隔离性。

5、MySQL中的锁

锁的分类:

  • 基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁、X锁)
  • 基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)
  • 基于锁的状态分类:意向共享锁、意向排他锁

事务的并发问题:在事务并发执行的时候,如果不进行事务的隔离,那么就会产生脏读、脏写、重复读、幻读的问题;

  • 脏读: 一个事务读取了另一个事务未提交的数据。

    示例: 事务A修改了一行数据,但尚未提交。事务B读取了这行未提交的数据,然后事务A回滚。此时,事务B读取的数据实际上是无效的,是“脏”的。

  • 脏写: 一个事务覆盖了另一个事务已经提交的数据。

    示例: 事务A修改了一行数据并提交,然后事务B修改了同一行数据并提交。事务B的提交导致了对事务A的修改的丢失,这是一种“脏写”。

  • 重复读:在一个事务内,两次读取同一行数据,但在两次读取之间有其他事务修改了这行数据。

    示例: 事务A读取了一行数据,然后事务B修改并提交了这行数据。接着,事务A再次读取相同的数据,发现数据已经发生了变化。这就是“重复读”。

  • 幻读: 在一个事务内,两次查询返回了不同数量的行,但在两次查询之间有其他事务插入了新的数据。

    示例: 事务A查询某个条件下的所有数据,然后事务B插入了符合该条件的新数据。接着,事务A再次查询相同的条件,发现返回的行数发生了变化,即出现了“幻读”。

事务的隔离级别:

  1. READ_UNCOMMITTED 读未提交
  2. READ_COMMITTED 读提交(不可重复读)
  3. REPEATABLE_READ 可重复读
  4. SERIALIZABLE 串行化

每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的并发事务问题也就越多,同时也就意味着家的锁就越多,所以性能也会越差。

事务的隔离级别解决的问题:

隔离级别事务读取事务写入解决问题存在问题
READ_UNCOMMITTED不加锁加写锁脏写脏读、不可重复读、幻读
READ_COMMITTED加读锁(每次select完都会释放读锁)加写锁脏读、脏写不可重复读、幻读
REPEATABLE_READ加读锁(每次select完不会释放锁,而是事务结束后才会释放)加写锁脏读、脏写、不可重复读、幻读(mysql的innodb已经解决)幻读(mysql的innodb不存在)
SERIALIZABLE不论是读还是写所有的事务串行化执行,一个事务的执行必须等其他事务结束

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

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

相关文章

RabbitMQ 报错:Failed to declare queue(s):[QD, QA, QB]

实在没想到会犯这种低级错误。 回顾整理一下吧: 原因:SpringBoot主配置类默认只会扫描自己所在的包及其子包下面的组件。其他位置的配置不会被扫描。 如果非要使用其他位置,就需要在启动类上面指定新的扫描位置。注意新的扫描位置会覆盖默…

PHP的Laravel的数据库迁移

1.默认迁移文件 2.数据库迁移 在终端输入以下代码 php artisan migrate 我的报错啦!!!!! 数据库里面只有两张表,实际上应该有四张的!!! 解决方法: 反正表已…

基于动态窗口的航线规划

MATLAB2016b可以运行 % ------------------------------------------------------------------------- % File : DWA 算法 % Discription : Mobile Robot Motion Planning with Dynamic Window Approach % Author :Yuncheng Jiang % License : Modified BSD Software License A…

【JDK21】详解虚拟线程

目录 1.概述 2.虚拟线程是为了解决哪些问题 2.1.线程切换的巨大代价 2.2.哪些情况会造成线程的切换 2.3.线程资源是有限的 3.虚拟线程 4.适用场景 1.概述 你发任你发,我用JAVA8?JDK21可能要对这句话say no了。 现在Oracle JDK是每4个版本&#x…

什么是https证书?

HTTPS证书,也称为SSL(Secure Sockets Layer)证书或TLS(Transport Layer Security)证书,是一种数字证书,用于在网络上建立安全的加密连接。它的主要目的是确保在互联网上进行的数据传输的安全性和…

工具系列:TimeGPT_(6)同时预测多个时间序列

TimeGPT提供了一个强大的多系列预测解决方案,它涉及同时分析多个数据系列,而不是单个系列。该工具可以使用广泛的系列进行微调,使您能够根据自己的特定需求或任务来定制模型。 # Import the colab_badge module from the nixtlats.utils pac…

AD使用的一些基本知识

主页工厂打板时,有些过孔要求在0.3/0.5以上,还有其他一些工艺要求也要注意 用keep-out layer还是mechanical layer 当做切割边线,都可以,也可以看制版工厂的要求 导出BOM表时,是以comment分类的,通常情况…

php-ssrf

漏洞描述: SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求…

FTP原理与配置

FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时,还可以保证数据传输的可靠性和高效性。 FTP的应用 FTP 提供了一种在服务器和客户机之间上传和下载文件的有效方式。在企业网络中部署一台FTP服务器,将网络设备配置为FTP客户端,则可…

大数据开发之Sqoop详细介绍

测试环境 CDH 6.3.1 Sqoop 1.4.7 一.Sqoop概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图: CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

基于ChatGpt,Java,SpringBoot,Vue,Milvus向量数据库的定制化聊天Web demo

customized chat GitHub - bigcyy/customized-chatgpt: 基于ChatGpt,Java,SpringBoot,Vue,Milvus向量数据库的定制化聊天Web demo 简介 基于ChatGpt,Java,SpringBoot,Vue,Milvus向…

华为---登录USG6000V防火墙---console、web、telnet、ssh方式登录

目录 一、环境搭建 二、第一次登录USG6000V防火墙,即通过console方式登录 三、通过web管理界面创建用户 四、web登录USG6000V防火墙 1. 用web创建的用户通过web方式登录USG6000V防火墙 2. 命令行创建的用户通过web方式登录USG6000V防火墙 五、ssh方式登录USG60…

TPRI-DMP平台介绍

TPRI-DMP平台介绍 TPRI-DMP平台概述 TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台,已经过13年的发展和迭代,其具备大规模能源电力行业生产应用软件开发和运行能力。提供TPRI-DMP平台主数据管理、业务系统开发与运行、应用资源管理与运维监控…

【C语言】程序练习(二)

大家好,这里是争做图书馆扫地僧的小白。 个人主页:争做图书馆扫地僧的小白_-CSDN博客 目标:希望通过学习技术,期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题: 2 自加自减运算符 3 关系运…

ios环境搭建_xcode安装及运行源码

目录 1 xcode 介绍 2 xcode 下载 3 xocde 运行ios源码 1 xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计&#xff0…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# HeapingVS Stacking第一节 理解堆与栈 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.n…

如何使用mac电脑,1、使用快捷命令打开访达,2、使用终端命令创建文件,3、使用命令打开创建的文件,并且在vscode中打开

如何使用mac电脑 1、使用快捷命令打开访达 optioncommand空格键 快速进入访达 shiftcmmandn 创建一个空目录 2、使用终端命令创建文件 2.1进入文件夹 在终端页面输入“cd /Users/yunf/Desktop/”并按回车键(此时进入到桌面文件夹,如果需要进入到其它…

Zabbix6 使用Agent2实现证书监控的详细步骤

目标 我们的目标是通过获取网站的证书信息来实现网站证书监控。 使用agent2的key 只需使用其中的key,就能实现我们的目标功能。然而,由于它返回的是json格式的数据,我们需要根据数据来配置监控项目(item)和触发器&am…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…