CSNotesCSNotes
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
  • 第一章 SQL语法

    • 1.1 数据库
    • 1.2 MySQL 语法
    • 1.3 查询
    • 1.4 什么是 join?
    • 1.5 LIKE 操作符
    • 1.6 分组
    • 1.7 字段都有哪些属性
  • 第二章 了解 SQL

    • 2.1 数据库基础
    • 2.2 数据库范式
    • 2.3 字符集
    • 2.4 数据库概念
    • 2.5 最大行大小
  • 第三章 数据库概念

    • 3.1 一条 SQL 语句是如何执行的?
    • 3.2 InnoDB 行格式
    • 3.3 为什么数据库 VARCHAR 字段上限是 16383?
  • 第四章 数据库数据结构

    • 4.1 数据库数据结构
  • 第五章 索引

    • 5.1 索引
    • 5.2 一个 B+ 树中大概能存放多少条索引记录?
  • 第六章 范式

    • 6.1 范式
  • 第七章 日志

    • 7.1 日志
  • 第八章 事务

    • 8.1 事务简介
    • 8.2 事务
  • 第九章 InnoDB 页

    • 9.1 InnoDB 页
  • 第十章 常见面试题

    • 10.1 数据库存储索引为什么不用二叉排序树,不用红黑树,而用 B+ 树?
    • 10.2 为什么 InnoDB 中 B+ 树一个结点的页设置为 16KB

8.1 事务简介

事务的定义

需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为事务。

为什么要有事务?

现实世界的业务场景需要映射到数据库世界,而现实世界中的一次状态转换需要满足下面几种特性:

事务的四大特性

原子性:事务作为一个整体被执行,其中的操作要么都做,要么都不做。

一致性:事务执行前后,数据库处于合法的状态。

隔离性:多个事务并发执行时,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能相互干扰。

持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

原子性(Atomicity)

拿转账作例子:

转账只有两种状态:要么转了,要么没转。这种规则叫做原子性。

隔离性(Isolation)

现实世界中,两种状态转换应该是互不影响的。让一些操作执行完了,再让另一些操作执行。

一致性(Consistency)

数据库中的数据符合所有现实世界的约束,比如红绿灯只有三种颜色,房价不能为负的。比如建立主键,唯一索引,外键等。

持久性(Durability)

一个状态转换完成后,这个转换的结果将永久保存。

事务状态.drawio
事务状态.drawio

可以看到,事务处于“提交的”或者“中止的”时候,事务结束。“中止的”代表数据库数据没有变化,“提交的”说明数据库变动刷新到磁盘了。

MySQL 怎么保证原子性?

undo Log

什么是脏读?

读到了另一个事务未提交的数据。

什么是不可重复读?

事务 B 读取了两次数据,读其中一次的过程中事务 A 改了数据,导致事务 B 读的两次数据不一样。

什么是幻读?

事务 B 前后两次读同一个范围的数据,事务 B 两次读取的过程中,事务 A 新增了数据,导致事务 B 后一次读取到了前一次查询没有读到的行。

四种隔离级别

  • 读未提交
  • 读提交
  • 可重复读
  • 串行化
编辑此页
上次更新:
Next
8.2 事务