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
相关推荐
东风破_6 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
九皇叔叔7 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
橙子家8 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_962066499 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext10 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界12 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统
何以解忧,唯有..12 小时前
Pydantic 介绍与使用:Python 数据校验的现代方案
数据库·python·microsoft
超兔一体云13 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
这个DBA有点耶13 小时前
数据库容灾进入“秒级时代”:同城双活架构原理、关键技术选型与落地实践
数据库·架构·dba
2601_9620748113 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql