MySQL中的事务问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL中的事务问题

事务的引出


比如我们手机转账的时候, 甲手机里的钱要转到乙手机里, 那么我们就要对甲的钱包实行扣钱操作,然后对乙手机钱包进行加钱操作, 假如操作执行一半,数据崩溃了,导致甲扣了钱,乙没加钱,那这就很尴尬了.(ps: 这种事情以前其实挺常见的)

事务就是为了解决上述问题.


什么是事务


事务的本质就是把多个 sql 语句打包成一个整体, 要么全部执行,要么一个都不执行, 不会出现执行一半这种中间状态.


回滚


其实上面的一个都不执行并不是真的一个语句都不执行, 而是看起来和没执行一样, 这里是因为它把数据恢复了. 这个恢复数据的操作 我们就叫它回滚.

进行回滚的时候,如何知道数据的初始状态呢?

数据库里有个专门记录事务的日志, 也正因如此, 使用事务的时候, 执行 sql 的开销是更大的, 效率更低.


事务的四个关键特性


1. 原子性


过去人们认为原子是事物能够分割的最小单位, 所以原子性就代表事务不可分割的特性.


2. 一致性


即事务执行前后, 数据得是靠谱的.

假如甲给乙转20块钱, 结果甲扣20, 乙收到2000块, 这不是无中生有吗,数据不能离谱, 得靠谱.


3. 持久性


事务修改的内容是写到硬盘上的, 持久存在的, 重启也不会丢失.


4. 隔离性


隔离性是为了解决’‘并发’‘执行事务, 引起的问题.(服务器同时处理多个客户端的请求, 就称为’‘并发’')

如果并发的这些事务是修改不同的表 / 不同的数据, 那没事.

但如果是修改同一个表 / 同一个数据, 那就可能带来一定的问题.

比如多个客户端一起尝试对同一个账户进行转帐, 此时可能就会把这个数据给搞乱了.

事务的隔离性就是为了在数据库并发处理问题的时候, 不会出问题.

下面来说说并发处理事务会有哪些问题, 以及处理方法.


并发执行事务可能出现的问题


1. 脏读问题


一个事务A正在对数据进行修改的过程中, 还没提交之前, 另一个事务B, 也对同一个数据进行读取, 此时B的读操作就称为"脏读", 读到地数据也称为"脏数据"(也就是无效数据).

为什么说是无效数据呢? 因为事务A还没对数据修改完成, B就读了, 所以B读到的数据不一定是事务A修改后并提交的数据.

为了解决脏读问题, mysql中引用了"写操作加锁"这样的机制

“写操作加锁” 其实就是事务A对数据进行操作的时候, B不能对该数据进行读操作, 直到A对数据操作完提交后, 才可操作.


给写操作加锁降低了并发程度(降低了效率), 提高了隔离性(提高了数据的准确性).


2. 不可重复读


事务1 已经提交了数据, 此时事务2 开始读取数据, 在读取过程中, 事务3 又提交了新的数据, 此时意味着同一个事务2 内, 多次读数据, 读出来的数据是不一样的(预期是多次读取结果一样), 这就叫做"不可重复读"(第二次读取结果不能复现第一次的结果).

mysql中通过对读加锁, 来保证在事务2 读取数据的时候, 不会再有新的数据更新(即当事务2 处理完后才能进行事务3)


通过对读加锁, 又进一步降低了事务的并发处理能力(处理效率也降低了), 提高了事务的隔离性(数据的准确性又得到提高)


3. 幻读


在读加锁和写加锁的前提下, 一个事务两次读取同一个数据, 发现读取的数据值一样, 但结果集不一样(Student.java 代码内容不变, 但第一次看到的是只有Student.java 这个文件, 第二次看到的却是Student.java 和 Teacher.java), 这种情况就称为"幻读".


数据库使用"串行化"来解决幻读, 彻底放弃并发处理事务, 一个接一个的串行处理事务.(这样做是并发程度最低的(效率最低), 隔离性是最高的(准确性也是最高的)).


对应上述问题, mysql提供了四种隔离级别:


read uncommitted 没有任何限制, 并行最高(效率最高), 隔离性最低(准确性最低)

read committed 给写加锁, 并发程度低, 隔离性提高了

repeatable read 给写和读都加锁, 并发程度又降低, 隔离性又提高了

serializable 串行化, 并发程度最低,隔离性最高


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 缓存 关系型数据库
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
122 7
MySQL事务日志-Undo Log工作原理分析
|
3月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
1019 2
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
3月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
5月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
168 43
|
5月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1899 14
MySQL事务日志-Redo Log工作原理分析
|
4月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
4月前
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。
|
6月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
1158 18
|
5月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?