不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • MySQL

    • 01.安装MySQL
    • 02.MySQL事务
      • 01.MySQL事务
        • 1.1 InnoDB事务原理
        • 1.2 事务四大特性
        • 1.3 InnoDB与MyISAM
        • 1.4 事务隔离级别
        • 1.4.1 未提交读: 脏读
        • 1.4.2 提交读: 不可重复读
        • 1.4.3 可重复读: 幻读(MySQL默认)
        • 1.4.4 可串行读
      • 02.事务使用举例
    • 03.MySQL锁
    • 04.MySQL索引 ✅
    • 05.MySQL慢查询
    • 06.MySQL优化
    • 07.binlog redolog undolog ✅
    • 08.MVCC原理 ✅
    • 09.SQL执行过程 ✅
    • 10.MySQL主从同步
    • 11.MySQL主从配置
    • 12.MySQL和Redis一致性
    • 13.MySQL查询缓存
    • 90.其他
    • 95.MySQL管理
    • 96.MySQL基本查询
    • 97.创建表结构
    • 98.SQL语句面试50题
    • 99.FAQ
  • Redis

  • Elasticsearch

  • Kafka

  • Etcd

  • MongoDB

  • TiDB

  • RabbitMQ

  • 数据库
  • MySQL
xiaonaiqiang
2021-02-22
目录

02.MySQL事务

# 01.MySQL事务

# 1.1 InnoDB事务原理

  • 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态
  • 在数据库提交时,可以确保要么所有修改都已保存,要么所有修改都不保存

# 1.2 事务四大特性

  • 原子性:整个事物的所有操作要么全部提交成功,要么全部失败回滚(要么全部执行,要么全部回滚)
    • eg:A向B转账100块,从A扣除成功而添加B失败,整个事务将回滚,确保没有部分完成的转账
  • 一致性:事务开始之前和事务结束以后,数据不会被破坏(保持数据库的一致性)
    • eg:假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的
  • 隔离性:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
  • 持久性: 事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中

原子性和一致性区别

  • 原子性并不能保证一致性,在多事务并行情况下,即使保证每个事物原子性,仍然可能数据不一致
  • 比如:假如同时开启两个事物A和B都要给tom账号转100元,可能增加两次,但是有一次被另一个事物覆盖

# 1.3 InnoDB与MyISAM

  • InnoDB是支持 事物,MyISAM不支持
  • InnoDB支持 行级锁,MyISAM不支持
  • InnoDB支持 外键,MyISAM不支持
  • InnoDB支持 崩溃恢复,MyISAM数据库崩溃,可能导致表损坏
  • InnoDB数据和索引存储在相同表空间,支持缓存机制,MyISAM数据和索引存储在两个不同文件中,不支持缓存机制
  • 引擎选择
    • MyISAM更适合读多写少的操作
    • 需要 事务、行级锁定、崩溃恢复 等高级特性,选择InnoDB更为合适

# 1.4 事务隔离级别

# 1.4.1 未提交读: 脏读

  • 读取到其他事务修改但未提交数据

  • 1)事务2查询到的数据是事务1中修改但未提交的数据,但因为事务1回滚了数据

  • 2)所以事务2查询的数据是不正确的,因此出现了脏读的问题

注:脏读没有MVCC机制,select 默认需要加共享锁

# 1.4.2 提交读: 不可重复读

  • 事务1读取到事务2修改前和修改后的数据,两次读取数据不一样
  • 1)事务2执行update语句但未提交前,事务1的前两个select操作返回结果是相同的
  • 2)但事务2执行commit操作后,事务1的第三个select操作就读取到事务2对数据的改变
  • 3)导致与前两次select操作返回不同的数据,因此出现了不可重复读的问题

注:不可重复读 有MVCC机制,select 默认不需要加共享锁

# 1.4.3 可重复读: 幻读(MySQL默认)

  • 事务1在自己版本号中,查询到另一个事务插入新的数据行,这就会导致该事物中凭空多出数据行
  • 这是MySQL的默认事务隔离级别
  • 1)事务A先查询id大于2的账户记录,得到记录id=2和id=3的两条记录
  • 2)这时候,事务B开启,插入一条id=4的记录,并且提交了
  • 3)事务A再去执行相同的查询,却得到了id=2,3,4的3条记录了

注:可重复读 有MVCC机制,select 默认不需要加锁

# 1.4.4 可串行读

  • 1)这是事务的最高隔离级别,通过强制事务排序,使之不可能相互冲突,就是在每个读的数据行加上共享锁来实现

  • 2)在该隔离级别下,可以解决前面出现的脏读、不可重复读和幻读问题,但也会导致大量的超时和锁竞争现象,一般不推荐使用

注:可串行读没有MVCC机制,select 默认需要加共享锁

# 02.事务使用举例

  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行

  • 例子:张三账户转账转出 100 元到李四的账户

    • 1、张三账户减去 100 元

    • 2、李四账户增加 100 元

begin; 
update user set balance = balance-100 where id=1;
# rollback;    # 如果rollback,就不会提交了
update user set balance = balance+100 where id=2; 
commit;      # 只有commit提交事务,其他事务才能看到结果
1
2
3
4
5

上次更新: 2024/10/15 16:27:13
01.安装MySQL
03.MySQL锁

← 01.安装MySQL 03.MySQL锁→

最近更新
01
300.整体设计
06-10
02
06.LangGraph
06-09
03
202.AI销售智能体
06-07
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式