MySQL事务管理详解:特性、问题与解决方案

什么是事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的四大特性

原子性(Atomicity)

原子性意味着事务中对数据库的一系列操作要么全部成功,要么全部失败,不可能出现部分成功或部分失败的情况。以转账为例,一个账户的余额减少,另一个账户的余额增加,这两个操作必须同时成功或同时失败。如果前一个操作成功了,而后一个操作失败,则必须回滚以确保原子性。原子性在InnoDB中是通过undo log来实现的,它记录了数据修改之前的值,以便在异常发生时通过undo log进行回滚操作。

一致性(Consistency)

一致性指的是事务执行前后数据库的状态必须是合法的,数据库的完整性约束没有被破坏。除了数据库自身的完整性约束,还包括用户自定义的完整性约束。例如,主键必须唯一,字段长度必须符合要求。在转账场景中,如果A账户减少1000元而B账户只增加500元,即使操作成功,也不满足一致性,因为导致了会计科目不平衡。

隔离性(Isolation)

隔离性确保多个事务并发执行时,一个事务的执行不应影响其他事务。不同事务对同一数据的并发操作应该是相互隔离的,透明的,互不干扰。隔离性通过多版本并发控制(MVCC)和锁机制来实现。

持久性(Durability)

持久性保证了事务一旦提交,其对数据库的修改将永久保存在数据库中,即使系统发生崩溃也不会丢失。持久性通过redo log实现,数据修改会先写入内存的缓冲池,并记录在redo log中,即使系统崩溃也能通过redo log恢复数据。

事务并发带来的问题

当多个事务并发操作数据库时,会产生脏读、不可重复读和幻读等问题。

脏读

一个事务读取了另一个事务未提交的修改数据,可能导致读取的数据不一致或不准确。

不可重复读

一个事务内多次读取同一数据,在这个事务未结束时,另一个事务修改了该数据,导致前后读取结果不一致。

幻读

一个事务读取某一范围的数据时,另一个事务在该范围插入新数据,导致前后读取的结果不一致,出现“幻觉”。

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB;INSERT into user VALUES (1,'1',20),(5,'5',20),(15,'15',30),(20,'20',30);

假设有如下业务场景:

时间事务1事务2
begin;
T1select * from user where age = 20;2个结果
T2insert into user values(25,‘25’,20);commit;
T3select * from user where age =20;2个结果
T4update user set name=‘00’ where age =20;此时看到影响的行数为3
T5select * from user where age =20;三个结果

隔离级别

隔离级别是事务并发控制的等级,描述事务之间的隔离程度。SQL标准定义了四个隔离级别:

隔离级别脏读不可重复读幻读
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××

READ-UNCOMMITTED(读取未提交):允许读取未提交的数据,可能会出现脏读。

READ-COMMITTED(读取已提交):只能读取已提交的数据,可能会出现不可重复读。

REPEATABLE-READ(可重复读):保证多次读取同一数据的一致性,但可能会出现幻读。

SERIALIZABLE(可串行化):最高隔离级别,完全隔离,防止脏读、不可重复读和幻读。

解决读一致性问题

LBCC(基于锁的并发控制)

通过锁定操作的数据行,确保事务读取的数据一致性。这种方式可能导致性能下降,因为阻止了并发读写操作。

MVCC(多版本并发控制)

通过保存数据的多个版本,实现事务之间的并发控制,确保读一致性,同时提高并发性能。

InnoDB中的锁

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
在这里插入图片描述

共享锁

允许事务读取数据,多个事务可以共享一个读锁。使用SELECT ... LOCK IN SHARE MODE语句手工加锁。

排它锁

用于修改数据,事务获取排它锁后,其他事务不能再获取该行的共享锁和排它锁。使用FOR UPDATE语句手工加锁。

意向锁

数据库自动维护,用于标识表中的某些数据行被加锁。

记录锁

锁定记录行所在的索引。

间隙锁

锁定索引记录之间的间隙,用于防止幻读。

临键锁

记录锁和间隙锁的组合,锁定索引记录及其前后的间隙。

死锁及其解决方案

死锁是指两个或多个事务相互等待对方释放锁,从而无法继续执行的现象。解决死锁的方法包括:

  1. 按照相同顺序访问表,减少死锁概率。
  2. 尽可能在事务中一次锁定所有资源。
  3. 对容易产生死锁的部分,尝试使用表锁。
  4. 优化索引,减少死锁可能性。

可以参考以下文章了解更多死锁分析和解决方案:

死锁分析与解决1

死锁分析与解决2

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

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

相关文章

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日,其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日,AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构,提升汽车系统的性能、安全性和可靠性,从而驱动行业的持续发展和创新,涵盖 Auto…

PHP萌宠之家微信小程序系统源码

🐾萌宠之家微信小程序🐾 —— 铲屎官们的温馨小窝✨ 🏠【一键开启萌宠乐园】🏠 亲们,是不是每次刷手机都忍不住想看看那些软萌可爱的毛孩子?现在,有了“萌宠之家”微信小程序,你的…

LeetCode 3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

【LetMeFly】3112.访问消失节点的最少时间:单源最短路的Dijkstra算法 力扣题目链接:https://leetcode.cn/problems/minimum-time-to-visit-disappearing-nodes/ 给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, l…

【深度学习】【Lora训练4】StabelDiffusion,人物lora训练

启动: docker run -it --gpus all --net host -v /ssd/xiedong/xiezhenceshi/lora_train:/ssd/xiedong/xiezhenceshi/lora_train kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers-lora-train bashrootgpu16:/workspace/lora-scripts# python…

6. JavaSE ——【深入理解Java中的按位运算符】

💻 开场白 欢迎来到我的技术博客!在这里,我们将一起探索编程的奥秘,分享代码的智慧,让技术改变生活。让我们开始这段精彩的旅程吧!🚀💻🌐 📖个人主页&#xf…

untiy 竖排文字

使用的tmp文本&#xff0c;启用富文本&#xff0c;默认就是启用的 然后在要竖排的文本前边拼接 效果如下 如果用代码拼接 text.text "<rotate90>""内容";

深入Redis集群部署:从安装配置到测试验证的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

安全防御2

实验要求&#xff1a; 实验过程&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)&#xff1a; 新建电信区&#xff1a; 新建移动区&#xff1a; 将对应接口划归到各自区域&#xff1a; 新建…

JVM--自动内存管理--JAVA内存区域

1. 运行时数据区域 灰色的线程共享&#xff0c;白色的线程独享 白色的独享就是根据个体"同生共死" 程序计数器&#xff1a; 是唯一一个没有OOM(内存溢出)的地方 是线程独享的 作用&#xff1a; 是一块较小的内存空间,是当前线程所执行的字节吗的行号指示器 由于…

云监控(华为) | 实训学习day2(10)

spring boot基于框架的实现 简单应用 - 用户数据显示 开发步骤 第一步&#xff1a;文件-----》新建---项目 第二步:弹出的对话框中,左侧选择maven,右侧不选任何内容. 第三步&#xff0c;选择maven后&#xff0c;下一步 第4步 &#xff1a;出现对话框中填写项目名称 第5步&…

全面了解不同GPU算力型号的价格!

这两年人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、深度学习和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;GPU算力已成为不可或缺的资源。企业、研究机构乃至个人开发者越来越依赖于GPU加速计算来处理大规模数据集和复杂模…

如何将大模型应用到自己的业务中?7种大模型应用方式和代表论文总结

如何将大模型应用落地到自己的业务或工作中&#xff1f;这篇文章整理了7种目前业内最常用的大模型应用方法&#xff0c;以及各个方法的代表论文。通过对各种应用大模型方法的特点对比&#xff0c;找到最适合自己场景的应用方法。 1 Pretrain-Finetune 直接针对下游任务进行全…

Linux介绍和文件管理

一Linux的起源 1.Unix Dennis Ritchie和Ken Thompson发明了C语言&#xff0c;而后写出了Unix的内核 2.Minix MINIX是一种基于微 内核架构的类UNIX计算机操作系统&#xff0c;由 Andrew S. Tanenbaum发明 3.Linux内核 芬兰赫尔辛基大学的研究生Linus Torvalds基于Gcc、 ba…

分布式存储之 ceph 管理操作

一.资源池 Pool 管理 我们已经完成了 Ceph 集群的部署&#xff0c;但是我们如何向 Ceph 中存储数据呢&#xff1f;首先我们需要在 Ceph 中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概念。我们可以将其理解为 Ceph 存储上划分的逻辑分区&#xff0c;Pool 由…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体&#xff0c;ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处&#xff1a; ELK 组件在大数据运维系统中&#xff0c;主要可解决的问题如下&…

适用于 Android 的恢复应用程序合集分享

丢失重要文件或数据从来都不是一件有趣的事。这种情况可能发生在您的计算机和笔记本电脑上&#xff0c;也可能发生在您的 Android 智能手机或平板电脑上。然而&#xff0c;尽管 Android 用户可能认为在这种情况下他们可用的选择较少&#xff0c;但用于 Android 数据恢复的应用程…

自定义注解 + Redis 实现业务的幂等性

1.实现幂等性思路 实现幂等性有两种方式&#xff1a; ⭐ 1. 在数据库层面进行幂等性处理&#xff08;数据库添加唯一约束&#xff09;. 例如&#xff1a;新增用户幂等性处理&#xff0c;username 字段可以添加唯一约束. ⭐ 2. 在应用程序层面进行幂等性处理. 而在应用程序…