MySQL13、事务&MVCC

什么是事务?

我们知道MySQL是一个客户端+服务器架构的软件。对于同一个服务器来说,可以有多个客户端连接,每个客户端与服务器建立连接后,就形成了一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分。服务器可以同时处理来自多个客户端的多个事务。

事务就是一个最小的、不可在分的工作单元,通常一个事务对应一个完整的业务。(比较经典的就是银行转账,要么都成功,要么都失败,没有中间状态)

事务的ACID

  1. 原子性(Atomicity):一个事务是一个不可再分割的整体,要么全部成功,要么全部失败。 事务在数据库中就是一个基本的工作单位,事务中包含的逻辑操作(SQL 语句),只有两种情况:成功和失败。事务的原子性其实指的就是这个。

  2. 一致性(Consistency):一个事务可以让数据从一种一致状态切换成另一种一致状态。比如:张三给李四转账 100 元,那么张三的余额应减少 100 元,李四的余额应增加 100 元,张三的余额减少和李四的余额增加这是两个逻辑操作具有一致性。

  3. 隔离性(Isolution):一个事务不受其他事务的影响,并且多个事务彼此隔离。一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不会互相干扰。

  4. 持久性(Durability):一个事务一旦被提交,在数据库中的改变就是永久的,提交后就不能再回滚。一个事务被提交后,在数据库中的改变就是永久的,即使系统崩溃重新启动数据库数据也不会发生改变。

事务必须满足ACID,否则数据就会出现混乱,这是不能忍受的。那如何实现ACID呢,最简单粗暴的方法就是系统在同一时间最多允许一个事务执行。其他事务只能在当前事务执行完毕,才能执行,相当于事务排队,这种也称为 串行执行。

串行执行缺点很明显,会降低系统的吞吐量和资源利用率,同时增加事务的执行时间,这肯定也不行。鱼和熊掌不可兼得,解决办法就是,牺牲一部分隔离性来换取系统的吞吐量和资源利用率。

在说如何实现之前,我们先了解一下,多个事务并发执行,会遇到哪些问题??

事务并发执行的问题

脏读

如果一个事务读取到另一个未提交事务修改过的数据,就意味着发生了脏读现象。

不可重复读

是指在一个事务内,多次读取同一数据。在这个事务还没有结束时,另外一个事务也访问该条数据,并修改了数据。在第一个事务中两次读取数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的现象。

幻读

如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事物写入了一些符合那些搜索条件的记录(这里的写入可以是INSERT、DELETE、UPDATE),这就意味着发生了幻读现象。(简单来说就是,一个事务根据某些条件搜索,第一次查询是3条符合,第二次再查变成了5条符合)

不可重复读和幻读区别:不可重复读的重点是修改,幻读的重点是新增或者删除

相关推荐
zzb15804 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿4 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
堕2744 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo4 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
雷工笔记5 小时前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying5 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组5 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
爬山算法6 小时前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb
l1t6 小时前
Deep Seek总结的APSW 和 SQLite 的关系
数据库·sqlite
Pocker_Spades_A7 小时前
基于代价模型的连接条件下推:复杂SQL查询的性能优化实践
数据库·sql·性能优化