MySQL13、事务&MVCC

什么是事务?

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

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

事务的ACID

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

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

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

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

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

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

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

事务并发执行的问题

脏读

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

不可重复读

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

幻读

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

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

相关推荐
Amagi.4 分钟前
Redis持久化机制
数据库·redis·缓存
拾伍廿肆15 分钟前
Django 聚合查询
数据库·django
jnrjian26 分钟前
Oracle SQL Developer DBA 管理工具入口
数据库·oracle
她似晚风般温柔78926 分钟前
Springboot3 + MyBatis-Plus + MySql + Uniapp 实现商品规格选择sku(附带自设计数据库,最新保姆级教程)
数据库·mysql·mybatis
Bear on Toilet1 小时前
初写MySQL四张表:(4/4)
数据库·mysql
全栈开发帅帅1 小时前
springboot中小学数字化教学资源管理平台
数据库·spring boot·oracle
落落落sss2 小时前
项目集成sharding-jdbc
android·java·数据库·spring·mybatis
尘浮生2 小时前
Java项目实战II基于Java+Spring Boot+MySQL的酒店客房管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·spring·intellij-idea
栀栀栀栀栀栀2 小时前
Redis笔记(基本操作+Java实现)
java·数据库·mybatis
看山还是山,看水还是。2 小时前
Web 渗透与防护
数据库·websocket·网络协议·web安全·网络安全·信息与通信·嵌入式实时数据库