MySQL-事务

事务特性

简称acid

原子性 : 事务执行过程中,要么全部成功,要么全部失败

一致性 : 事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态

隔离性 : 多个事务同时使用相同的数据时,不会相互干扰

持久性 : 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

事务隔离级别

  • 读未提交: 可以读取/修改别的事务未提交的数据;四种问题都没有解决
  • 读已提交: 解决了脏写,脏读;
  • 可重复读(默认) : 解决了脏写,脏读,不可重复读问题
  • 串行化: 在事务持续期间,禁止其他事务对该表进行插入,删除,修改操作,所有的并发问题都可以避免

事务并发带来的问题

脏写

对未提交的事务中的数据进行修改, 事务最终提交,导致写失效.

脏读

读取未提交事务中的数据,就是脏数据.

不可重复读

在一个事务内多次读取同一个数据,数据值不同.

幻读

在一个事务内多次读取一张表,记录数发生变化.

MVCC(重点)

MVCC多版本并发控制,作用就是对不同事务隔离级别生成不同的ReadView,来解决并发带来的事务问题.

  1. 快照读
    读取的是快照数据,不加锁的简单的select都是快照读;
    是基于MVCC生成的快照;
    所以不一定是最新的数据。
  2. 当前读
    当前读是数据的最新版本;
    如何保证读取的是最新?
    加锁;保证其他事物不能修改当前数据;
    select for update;
    insert into
    delete from
    update
    都会对数据加排他锁(写锁,间隙锁);
  3. 隐藏字段
    对于Innodb存储引擎,聚簇索引记录中都包含两个隐藏字段:
    (1)trx_id :当前事务id
    (2)roll_pointer :指向上一个版本数据的指针
    每次对某条聚簇索引的数据进行修改,就会把旧版本的数据写UodoLog;
  4. undoLog版本链

ReadView

  1. 读已提交 和 可重复读 隔离级别的事务,都是通过MVCC生成的快照实现;
    "唯一不同的是 读已提交 和 可重复读 生成快照的时机不同"
  2. 如何生成快照?
    2.1 四个重要的参数
    (1)creator_trx_id 当前事务的id(创建这个ReadView的id)
    (2)trx_ids 未提交事务的id List
    (3)up_limit_id 未提交事务的最小id
    (4)low_limit_id 在生成当前ReadView时刻,系统中下个事务生成的id
    2.2 如何生成
    读已提交 和 可重复读都要保证 "读到的事务都是已经提交的事务"
    所以
  3. 当被访问数据的事务的id<up_limit_id 一定可以被访问
  4. 当被访问数据的事务的low_limit_id>id>up_limit_id且不在trx_ids中,一定可以被访问
  5. 当被访问数据的事务的id>=low_limit_id不可以被访问
    2.3 快照生成的时机
    1.读已提交,在事务中每次的Select都会生成一个新的ReadView。
    2.可重复度,在事务第一个Select就会生成一个ReadView,且以后的Select都使用这个ReadView
相关推荐
2301_7930868741 分钟前
Redis 03 redis 缓存异常
数据库·redis·缓存
羊锦磊2 小时前
[ Mybatis 多表关联查询 ] resultMap
java·开发语言·数据库·mysql·mybatis
全栈工程师修炼指南7 小时前
DBA | SQL 结构化查询语言介绍与学习环境准备
数据库·sql·学习·dba
RationalDysaniaer8 小时前
MySQL时间类型
数据库·mysql
代码的余温8 小时前
MySQL三大存储引擎对比:InnoDB vs MyISAM vs MEMORY
数据库·mysql
扶风呀8 小时前
MySQL宝典
数据库·mysql
fatfishccc9 小时前
循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
xml·java·数据库·spring·intellij-idea·ioc·di
你的电影很有趣10 小时前
lesson37:MySQL核心技术详解:约束、外键、权限管理与三大范式实践指南
数据库·mysql
爬山算法10 小时前
MySQL(191) 如何优化MySQL的磁盘I/O?
android·数据库·mysql
野犬寒鸦11 小时前
Java Stream API 中常用方法复习及项目实战示例
java·服务器·开发语言·数据库