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

news2025/1/13 0:20:59

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.coloradmin.cn/o/1341046.html

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

相关文章

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言:生活中我们总是会碰到各种各样的排序,今天我们就对部分常用的排序进行总结和学习,今天的内容还是相对比较简单的一部分,各位一起加油哦! 💖 博主CSDN主页:卫卫卫的个人主页 💞 &#x1f44…

Python经典游戏 唤醒你童年记忆

这些游戏你玩过几个&#xff1f; 1.贪吃蛇2.吃豆人3.加农炮4.四子棋5. Fly Bird<font color #f3704ab>6.记忆&#xff1a;数字对拼图游戏&#xff08;欢迎挑战&#xff01;用时&#xff1a;2min&#xff09;7.乒乓球8.上课划水必备-井字游戏&#xff08;我敢说100%的人都…

verilog rs232串口模块

前面发了个发送模块&#xff0c;这次补齐&#xff0c;完整。 串口计数器&#xff0c;波特率适配 uart_clk.v module uart_clk(input wire clk,input wire rst_n,input wire tx_clk_en,input wire rx_clk_en,input wire[1:0] baud_sel,output wire tx_clk,output wire rx_clk )…

spring、springmvc、springboot、springcloud简介

spring简介 spring是什么&#xff1f; spring: 春天spring: 轻量级的控制反转和面向切面编程的框架 历史 2002年&#xff0c;首次推出spring雏形&#xff0c;interface 21框架2004年&#xff0c;发布1.0版本Rod Johnson: 创始人&#xff0c;悉尼大学&#xff0c;音乐学博士…

什么是 NLP (自然语言处理)

NLP&#xff08;自然语言处理&#xff09;到底是做什么&#xff1f; NLP 的全称是 Natural Language Processing&#xff0c;翻译成中文称作&#xff1a;自然语言处理。它是计算机和人工智能的一个重要领域。顾名思义&#xff0c;该领域研究如何处理自然语言。 自然语言就是我…

企业如何购买腾讯云服务器?(详细指南)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

前端基本性能指标及lighthouse使用

文章目录 1、基本指标介绍2、Performace分析2.1 performance属性2.2 使用performace计算2.3 Resource Timing API2.4 不重复的耗时时段区分2.5 其他组合分析2.6 JS 总加载耗时2.7 CSS 总加载耗时 3、lighthouse基本使用3.1 使用Chrome插件lighthouse3.2 使用Chrome浏览器开发者…

SQL server使用profiler工具跟踪语句

1.打开SQL server工具&#xff0c;在工具点击SQL server Profiler : 2.流程&#xff1a;暂停——清空———点击接口——启用&#xff1a; 3.找到对应的sql语句&#xff0c;复制到查询界面&#xff0c;开始查询数据&#xff1a;

QML —— ProgressBar示例(附完整源码)

示例 - 效果 实例 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {id: rootIdvisible: truewidth: 640height: 480title: qsTr("Hello World")Column{spacing: 40anchors.centerIn: parent…

UG NX二次开发(C++)-通过两点和高度创建长方体

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、采用UFun函数来创建长方体3、采用NXOpen方法实现两点和高度创建长方体4、验证1、前言 在UG NX二次开发时,我们通常会采用ufun函数来完成功能的开发,但是有些功能在ufun函数中不能找到…

电子握力器改造

toy_hand_game 介绍 消耗体力玩具&#xff0c;使用握力器(Grip Strengthener)控制舵机旋转。 开始设想是控制丝杆电机滑动&#xff0c;两套设备就可以控制两个丝杆电机进行“模拟拔河”&#xff0c;后续发现硬件设计错误&#xff0c;ULN2003不能控制两相四线电机&#xff0c;…

大数据Doris(四十三):创建物化视图

文章目录 创建物化视图 一、首先你需要有一个Base表

1933年地级市民国铁路开通数据(地级市工具变量)

1933年地级市民国铁路开通数据&#xff08;地级市工具变量&#xff09; 1、时间&#xff1a;1933年 2、指标&#xff1a;是否开通铁路 3、来源&#xff1a;来源于《中国铁道便览》和《中国铁道便览》 4、方法说明&#xff1a;参考田坤&#xff08;2023&#xff09;参考章元…

绝缘电阻测试仪的读数方法有哪些?

绝缘电阻测试仪主要用于测量设备的绝缘电阻&#xff0c;电力工人经常使用它来测试电力设备&#xff0c;从来没有维护过电力设备的正常运行状态。在测试电力设备时&#xff0c;往往需要读取测试结果。绝缘电阻测试仪常用的读数方法有哪些&#xff1f;我一起来盘点一下。 常用的绝…

15 Sequence-Driver-Sequencer communication in UVM

我们分别讨论了sequece_item、sequence、sequencer和driver。在本节中&#xff0c;我们将讨论他们如何相互talk&#xff0c;sequencer如何给driver提供从sequence里的sequence item。在开始阅读本节之前&#xff0c;请确保您了解sequencer和driver中使用的所有方法。&#xff0…

idea Spring Boot项目使用JPA创建与数据库链接

1.pom.xml文件中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>…

Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

文章目录 相关链接运行环境前言计算机图形OpenCV简单使用图形读取文件读取可能会出现的问题&#xff1a;路径不对解决方案其它路径问题解决方案 图像显示保存OpenCV视频视频素材如何获取&#xff1f;简单视频读取 相关链接 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 …

Jackson通过自定义序列化器给URL拼接访问域名

1、需求 在存储文件访问路径时&#xff0c;一般不会存储域名地址&#xff0c;若文件服务域名和当前应用域名不一致时&#xff0c;就需要在返回数据库的图片路径给前端时&#xff0c;拼接文件服务的域名。 2、处理方式 因为Spring Boot默认使用的是Jackson作为序列化工具&…

redis的搭建及应用(二)-redis的持久化策略

Redis的持久化策略 RDB RDB持久化是指在指定的时间间隔内将redis内存中的数据集快照写入磁盘&#xff0c;实现原理是redis服务在指定的时间间隔内先fork一个子进程&#xff0c;由子进程将数据集写入临时文件&#xff0c;写入成功后&#xff0c;再替换之前的文件&#xff0c;用二…