【MySQL】事务、事务隔离级别、死锁

news2025/1/24 0:56:00

文章目录

  • 1. 事务
    • 1.1 事务的属性 ACID
    • 1.2 创建事务
    • 1.3 autocommit
  • 2. 并发和锁定
    • 2.1 并发问题
  • 3. 事务隔离级别
    • 3.1 读未提交
    • 3.2 读已提交
    • 3.3 可重复读:MySQL的默认事务隔离级别
    • 3.4 序列化
  • 4. 死锁

1. 事务

  • 事务:单个工作单元的一组SQL语句。事务中的所有语句都应成功完成,否则事务会运行失败。

1.1 事务的属性 ACID

  1. 原子性 Atomicity:要么全部成功,即事务内的所有语句都成功执行并提交;要么全部回滚,即事务被退回,所做的所有更改都被撤销。
  2. 一致性 Consistency:事务执行前后数据库处于一致性。例如:不会出现订单没有项目的情况 ;AB之间转账,A少100,B必须增加100。
  3. 隔离性 Isolation:事务之间相互隔离。当同样的数据被不同事务更改时,事务之间不会互相干扰。如果多个事务想更新相同的数据,受到影响的行会被锁定,因此一次只有一个事务可以更新行,其他事务必须等正在运行的事务完成。
  4. 持久性 Durability:一旦事务被提交,事务对数据库产生的更改和影响是永久的。

1.2 创建事务

  • commit:自动提交事务
  • rollback:事务回滚,退回事务并撤销所有更改。撤销已执行但未提交的操作,将数据库恢复到以前的状态。
start transaction;

SQL语句

commit; / rollback;

1.3 autocommit

  • autocommit变量,如果事务中的语句都没有错误就会自动提交。
show variables like 'autocommit'

在这里插入图片描述

2. 并发和锁定

  • 并发:两个及以上的用户同时访问相同数据的情况
  • 锁: 防止两个事务同时更新同样的数据,使事务一个一个地按照顺序运行。一个事务执行更新时,会放一个锁在执行的行上;此时另一个事务尝试更新带锁的行,必须等第一个事务完成后(事务被提交或退回),才能更新。

2.1 并发问题

  1. 丢失更新
    • 情景:两个事务尝试更新相同的数据且没有上锁,较晚提交的事务会覆盖早提交事务做的更改。
    • 解决方法:可重复读 / 序列化。
  2. 脏读
    • 情景:事务读取了未被提交(commit)的数据。例如,事务A将客户1积分从10变为20,但未提交事务。此时事务B使用此客户1的积分20用于计算折扣。后事务A回滚了,客户1的积分最终还是10。事务B读取了事务A没有提交的数据,造成了脏读。
    • 解决方法:建立事务隔离级别,读已提交 / 可重复读 / 序列化。使事务修改的数据不会立马被其他事务读取。
    • 读已提交:事务只能读取已提交的数据。
  3. 不可重复读 / 不一致读:
    • 情景:在事务中读取了相同的数据两次,但得到了不同的结果。例如,事务A第一次读取客户积分为10,中间事务B将客户积分改为0并提交,事务A后续又读取客户积分此时变为0。事务A两次读取的数据是不一致的。
    • 解决方法:建立事务隔离级别,可重复读 / 序列化。在此隔离级别上,读取到的数据是可重复且一致的。
    • 可重复读:事务A首次读取数据时创建快照,此时事务B更改了数据,事务A再次读取时是读取的首次读取时创建的快照。
  4. 幻读
    • 情景:查询中缺失了一行或者多行,因为有另外一个事务正在修改数据,而查询的事务没有意识到其他事务的修改。例如,事务A查询积分超过10的所有顾客,事务B为另外一位顾客更新了积分超过10,但事务A的查询中没有返回这个新的顾客数据。
    • 解决方法:隔离级别,序列化。能保证当有别的事务B在更新数据时,正在执行的事务A能够知晓数据的变动。如果事务B修改了可能影响事务A查询结果的数据,事务A必须等事务B执行完,这样事务就会按序列化执行。
    • 序列化:是应用于一个事务的最高隔离级别,为操作提供了最大的确定性。但用户和并发事务越多,等待时间越长,系统会变慢 。所以隔离级别会损害性能和可扩展性。 因此只有在真的有必要防止幻读的情况下才用序列化。

3. 事务隔离级别

  • 总览
    在这里插入图片描述

  • 隔离级别越高,会有越重的性能和可扩展性的问题。隔离级别越低,更容易并发,会有更多用户可以在同时接触到同一数据。

    • 隔离界别从低到高:读未提交——读已提交——可重复读——序列化
    • MySQL中默认的事务隔离级别:可重复读。可防止除幻读以外的大多数并发问题。只在必要时更改事务隔离级别。
  • 查看当前隔离级别:默认是可重复读

    show variables like 'transaction_isolation'
    

    在这里插入图片描述

  • 更改事务隔离级别

    -- 为下一个事务更改隔离级别
    set transaction isolation level serializable 
    
    -- 为当前会话或当前连接中的事务设置隔离级别,当前连接立即生效
    set session transaction isolation level serializable
    
    -- 全局,不包括当前连接,之后新获取的连接都会生效。
    set global transaction isolation level serializable
    

3.1 读未提交

  • 可能会发生:所有并发问题,丢失更新、脏读、不一致读、幻读。
  • 等级最低的隔离级别。但是最快的隔离级别,不设置任何锁,且忽略了其他事务设置的锁。
  • 可以在不需要精确一致性或数据不怎么更新,且想要更好的性能时的情况下使用。

3.2 读已提交

  • 解决:脏读
  • 可能会发生:可重复读
  • 可以在不需要精确一致性或数据不怎么更新,且想要更好的性能的情况下使用。

3.3 可重复读:MySQL的默认事务隔离级别

  • 解决:不可重复读 / 不一致读。
  • 可能会发生:幻读
  • 默认的事务隔离级别。比序列化更快,且防止了除幻读以外的并发问题。在此级别下,事务中读取到的数据是一致的。

3.4 序列化

  • 解决:幻读
  • 最高的事务隔离级别。解决所有的并发问题。
  • 但事务是一个一个运行的,当用户较多时,等待时间增加、性能不好。

4. 死锁

  • 当不同事物因握住彼此事物需要的锁,两个事物都一直在等待对方,永远无法释放锁。两个事务互相锁住了对方将要操作的数据

  • 例如:两个会话中的事务在更新数据时,语句顺序不同,会发生死锁。事务1的更新1执行后,执行事务2的更新1,再执行事务2的更新2时,会等待事务1释放更新1的锁。事务1执行更新2时又要等待事务2释放更新1的锁。彼此之间握住了对方需要的锁,发生死锁。

    -- 事务1
    use sql_store;
    start transaction ;
    update customers set state = 'VA' where customer_id = 1;
    update orders set status = 1 where  order_id = 1;
    commit;
    
    -- 事务2
    use sql_store;
    start transaction ;
    update orders set status = 1 where  order_id = 1;
    update customers set state = 'VA' where customer_id = 1;
    commit;
    
  • 解决方案

    • 在不同事务中更新数据时遵照相同的语句顺序。检查经常出现死锁的事务中的语句顺序。如果不同的事务以相反的顺序更新数据,就很可能发生死锁。
    • 尽量简化事务,缩短事务运行时长。

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

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

相关文章

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备(CompactRIO、sbRIO、myRIO等)进行编程时,需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”,为用户提供图形用户界面(GUI),用于监控系统…

基于SpringBoot简洁优雅的个人博客系统

源代码下载地址: 点击这里下载 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或…

React学习计划-React16--React基础(四)生命周期和diffing算法,key的作用

1. 生命周期 1. 声命周期的三个阶段(旧) 初始化阶段:由ReactDOM.render()触发—初次渲染 1. constructor() 2. componentWillMount() 3. render() 4. componentDidMount() > 常用一般在这个钩子中做一些初始化的事情,例如&am…

Javascript知识点锦集

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/135165704 出自【进步*于辰的博客】 文章目录 1、其他知识点链接7、关于 false8、关于 null 与 …

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

抖店只能用官方电子面单?2024抖店玩法解读,附面单使用教程

我是王路飞。 正在做抖店的商家,应该都发现一件事情了,那就是现在的抖店好像不让拍单了,只能使用抖音的电子面单,打单发货。 说实话,这种情况已经出现过太多次了,导致很多商家不以为然。 我曾经也说过&a…

Midjourney v6 正式发布,AI创新工坊同步更新

Midjourney v6 开发团队将从2023 年 12 月 21 日今晚开始,在寒假期间让社区测试Midjourney v6模型的 alpha 版本。 要打开它,V6请从提示下方的下拉菜单中选择/settings或--v 6在提示后键入。 Midjourney v6 基本型号有哪些新功能? 更准确的…

受控代码生成-CCS 23

Large Language Models for Code: Security Hardening and Adversarial Testing 1.Introduction2.Background3.受控代码生成4.SVEN4.1.Inference4.2.Training4.2.1.训练样本4.2.2.loss函数 4.3.数据集构建 5.使用场景5.1.安全性增强5.2.对抗测试 6.实验6.1.实验设置6.2.Main Ex…

【数据结构和算法】---栈和队列的互相实现

目录 一、用栈实现队列1.1初始化队列1.2模拟入队列1.3模拟出队列1.4取模拟的队列头元素1.5判断队列是否为空 二、用队列实现栈2.1初始化栈2.2模拟出栈2.3模拟入栈2.4取模拟的栈顶元素2.5判读栈是否为空 一、用栈实现队列 具体题目可以参考LeetCode232. 用栈实现队列 首先要想到…

目标检测应用场景—数据集【NO.24】行人车辆检测数据集2

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

Neural-Chat-7B:Intel如何塑造下一代对话AI

引言 在人工智能的领域中,对话模型的进步正改变我们与技术的互动方式。Intel近期推出的Neural-Chat-7B模型,不仅标志着对话AI的一大步前进,更预示着未来人机交流的新方向。本文将深入探索这一模型的核心特性、训练过程及其在实际应用中的潜力…

【内存泄漏】Malloc Debug 和 libmenunreacbale 原理介绍

内存泄漏检测原理介绍 malloc debug 原理介绍 分为初始化和内存泄漏检测两个阶段介绍。 初始化阶段 整体流程如下图 libc 初始化时通过 __libc_init_malloc 函数调用 MallocInitImpl 来初始化 memory allocation framework。 // malloc_common_dynamic.cpp static const…

2024应届大学生,为云计算高薪岗位做好准备了吗?

云计算正处于快速发展阶段,对于企业和个人来说,云计算提供了方便、灵活和智能的解决方案,对各行各业都有着重要的影响和推动作用。 随着云计算新市场、新业务、新应用的不断出现,人力需求迅猛。国家相继出台一系列政策大力扶持云…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口…

什么是Web 3.0以及为什么它很重要【译文】

作者:马克斯-默施和理查德-穆尔黑德 什么技术使30多亿人每天80%的清醒时间受益?就是Web 2.0。 Web 2.0是OReilly等人在1999年至2004年间提出的,它将世界从为信息消费而设计、由昂贵的服务器提供的静态桌面网页转向互动体验和用户生成的内容&a…

革命性突破:Great River推出XL高速ARINC 818传感器测试卡

Great River Technology荣幸地宣布,与RVS(远程视觉系统)2.0平台合作推出的XL高速ARINC 818传感器测试卡正式亮相。这款开创性的测试卡在柯林斯航空电子公司(RTX业务部)和波音公司开发和测试RVS 2.0系统中发挥了重要作用…

【Spring Security】认证密码加密Token令牌CSRF的使用详解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 …

P3375 【模板】KMP

【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​,若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同,则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了,其出现位置为 l l l。 现在请你求…

关于使用libnet时性能下降的问题分析

Libnet是一个用于构建和注入网络数据包的便携式框架。它提供了在IP层和链路层创建数据包的功能,以及一系列辅助和补充功能。Libnet非常适合编写网络工具和网络测试代码。一些使用libnet的项目包括arping、ettercap、ipguard、isic、nemesis、packit、tcptraceroute和…

Ubuntu 常用命令之 scp 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 SCP(Secure Copy)是一种基于SSH(Secure Shell)的文件传输协议,它可以在本地和远程主机之间安全地复制文件。在Ubuntu系统下,我们可以使用scp命令来实现这个功…