MySQL13、事务&MVCC

什么是事务?

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

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

事务的ACID

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

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

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

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

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

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

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

事务并发执行的问题

脏读

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

不可重复读

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

幻读

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

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

相关推荐
czhc114007566322 分钟前
c# 1213
开发语言·数据库·c#
voltina29 分钟前
【SQL】【事务】
数据库·sql
古渡蓝按1 小时前
PostgreSQL数据库在Windows上实现异地自动备份指南-喂饭图文教程
数据库
她说..1 小时前
MySQL数据处理(增删改)
java·开发语言·数据库·mysql·java-ee
E***U9451 小时前
从新手到入门:如何判断自己是否真的学会了 Spring Boot
数据库·spring boot·后端
Alex Gram1 小时前
MySQL实时同步到SQL Server:技术方案与实现路径
数据库·mysql
不穿格子的程序员2 小时前
Redis篇3——Redis深度剖析:内存数据的“不死之身”——RDB、AOF与混合持久化
数据库·redis·缓存·数据持久化·aof·rdb
秋深枫叶红2 小时前
嵌入式第三十四篇——linux系统编程——进程
linux·服务器·数据库·学习
贡献者手册2 小时前
SQLite 的进阶版,面向边缘计算、嵌入式场景的高性能本地数据库【Turso Database】
数据库
TH_12 小时前
6、前台界面传递老数据,导致业务数据错误
数据库