wxvirus wxvirus
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

无解的lifecycle

let today = new Beginning()
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • C&C++

  • PHP

  • Python

  • Go

  • microservice

  • rust

  • Java

  • 学习笔记

    • 《Git》学习笔记
    • MySQL基础学习
    • redis基础
    • redis了解
    • MySQL事务并发问题
    • MySQL事务隔离级别
      • 事务的隔离级别
        • 模拟脏读
    • 单点登录token与JWT介绍
    • MySQL约束条件
    • redis持久化机制以及缓存过期和淘汰策略
    • redis数据类型
    • consul的raft算法
  • 后端
  • 学习笔记
wxvirus
2021-11-28

MySQL事务隔离级别

# 事务的隔离级别

事务的隔离级别取决于如何控制并发用户读写数据的操作。数据库是运行多用户并发访问的,如果多个用户同时开启事务,并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读的问题,所以 MySQL 中提供了四种隔离级别来解决上述问题。

提示

事务的隔离级别从低到高依次为:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIAZBLE

隔离级别越低,越能支持高并发的数据库操作

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED ✔️ ✔️ ✔️
READ COMMITTED × ✔️ ✔️
REPEATABLE READ × × ✔️
SERIALIAZBLE × × ×
  • ×代表不会出问题 = 解决问题
  • ✔️代表会出问题

提示

一般使用REPEATABLE READ这比较多,且数据库的默认隔离级别是它。

查看默认的事务隔离级别

# 查看默认的事务隔离级别
select @@transaction_isolation;

# 设置事务的隔离级别(加上session是设置当前会话的隔离级别)
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
1
2
3
4
5
6
7
8

# 模拟脏读

进程 1:navicat客户端操作数据库

# 第一步
start transaction;

# 第三步
select * from account where id = 1; # 查询id=1的余额 当前余额 100

# 第五步
select * from account where id = 1; # 再次查询id=1的余额  现在 200
1
2
3
4
5
6
7
8

进程 2:cmd或terminal操作数据库

# 第二步
start transaction;

# 第四步
update account set balance = balance + 100 where id = 1; # id=1的余额加100

# 第六步
rollback; # 事务回滚 ,修改的操作没用

# 第七步
select * from account where id = 1; # 100
1
2
3
4
5
6
7
8
9
10
11

设置事务隔离级别为read committed

再进行一次流程。

这次从cmd/shell/terminal/zsh进行操作的修改的后一步,navicat查询的时候,不会查询到+100的之后的结果。

如果cmd进程进行提交commit,则navicat客户端再次查询就会变成+100之后的结果。

编辑 (opens new window)
上次更新: 2021/11/28, 20:18:42
MySQL事务并发问题
单点登录token与JWT介绍

← MySQL事务并发问题 单点登录token与JWT介绍→

最近更新
01
vue3配合vite初始化项目的一些配置
07-26
02
网盘系统开发学习
07-24
03
linux多进程
06-19
更多文章>
Theme by Vdoing | Copyright © 2021-2024 wxvirus 苏ICP备2021007210号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式