MYSQL事务篇--事务隔离机制

事务有哪些特性?

事务是由MYSQL的引擎来实现的,并不是所有的引擎都支持事务。

常见的MYSQL引擎

InnoDB引擎
  • InnoDB是MYSQL默认的事务性存储引擎,其核心优势在于对ACID事务的完整支持,这确保了再高并发的环境下数据操作的一致性,原子性,隔离性与持久性。
  • InnoDB采用了行级锁定机制,能够最大程度的减少并发写入时的锁冲突,提高系统的并发处理能力。
  • 此外InnoDB还支持外键约束,有助于维护数据之间的参照完整性,并通过redo log和undo log实现了可靠的崩溃恢复能力,保证数据在意外停机后的不丢失与一致性
  • InnoDB 引擎内部的缓冲池 机制也能有效地缓存数据和索引,提升读写性能。因此,InnoDB 适用于有高并发、事务支持和数据完整性需求的应用场景。
MylSAM引擎
  • 与 InnoDB 不同,MyISAM 是一个非事务性 的存储引擎,它不支持 ACID 事务 ,这意味着在并发写入或系统崩溃时,数据的一致性无法得到保证。它同样也不支持外键约束
  • MyISAM 采用了表级锁定 ,即当一个写操作发生时,会锁定整个表,这在高并发写入场景下会导致严重的性能瓶颈。
  • MyISAM 的主要特点是其读取速度快,因为它将数据和索引分开存储,并且结构相对简单。
  • 然而,由于缺乏事务支持和行级锁定 ,MyISAM 更适用于读多写少、对数据一致性要求不高的简单应用,例如一些只读的报表查询或日志记录。
Memory引擎
  • Memory 引擎将所有数据存储在内存 中,因此具有极高的读写速度
  • 然而,其最大的缺点是数据的易失性,一旦 MySQL 服务器关闭或重启,存储在 Memory 引擎中的数据将会全部丢失。
  • Memory 引擎支持表级锁定 ,这个引擎通常是用于创建临时表 ,或者缓存一些频繁访问且数据量不大对持久性要求不高的临时数据,以加速查询。
Archive引擎
  • Archive 引擎主要用于存储 大量 不经常访问的归档数据
  • 它最大的特点是对数据进行高度压缩,能够显著节省存储空间。
  • Archive 引擎支持高速的数据插入 ,但其查询性能非常差 ,通常只能进行全表扫描,并且不支持索引。因此,它适用于那些只需要将数据写入并长期保存,而对查询性能要求不高的场景,例如存储历史日志或传感器数据。

事务的四大特性

原子性:一个事务中的所有操作要么成功,要么失败即要么全部成功,要么全部失败。

一致性:是指事务操作前后,数据满足完整性约束,数据库保持一致性状态。

隔离性:数据库允许多个并发事务同时对其数据库进行读写和修改的能力,隔离性可以防止并发执行由于交替执行引发的数据不一致问题。

持久性:事务处理结束后对数据的修改是永久的,即便系统故障也不会丢失。

InnoDB引擎是通过什么技术来保证事务的四大特性的?

持久性通过redo log(重做日志)来保证的。

原子性是通过undo log(回滚日志)来保证的。

隔离性是通过MVCC(多版本控制并发)或锁机制来保证的。

一致性则是通过持久性+原子性+隔离性来保证的。

并发事务会引发什么问题?

脏读

定义:一个事务读到了另一个事务中未提交的数据。

例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取小林的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。

因为事务A还没有提交事务,随时可能会发生回滚操作,如果发生回滚,B读到的数据就是过期数据,这种现象被称为脏读。

不可重复读

定义:在一个事务内多次读取同一个数据,前后两次读到的数据不一样。

例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后继续执行代码逻辑处理,在这过程中如果事务 B 更新了这条数据,并提交了事务,那么当事务 A 再次读取该数据时,就会发现前后两次读到的数据是不一致的,这种现象就被称为不可重复读。

幻读

定义:在一个事务内多次查询某个记录数量,前后两次查询到的数量不一致。

例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库查询账户余额大于 100 万的记录,发现共有 5 条,然后事务 B 也按相同的搜索条件也是查询出了 5 条记录。

接下来,事务 A 插入了一条余额超过 100 万的账号,并提交了事务,此时数据库超过 100 万余额的账号个数就变为 6。

然后事务 B 再次查询账户余额大于 100 万的记录,此时查询到的记录数量有 6 条,发现和前一次读到的记录数量不一样了,就感觉发生了幻觉一样,这种现象就被称为幻读。

事务的隔离机制有哪些?

读未提交:指一个事务还没有提交时,它做的变更就能被其他事物看到。

可能出现:脏读 不可重复读 幻读

读提交:指一个事务提交后,他做的变更才能被其他事务看到。

可能出现:不可重复读 幻读

可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MYSQLInnoDB 引擎的默认隔离级别。

可能出现:幻读

串行化:会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等待前一个事务执行完成时,才能继续执行。

相关推荐
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull8 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb