MySQL高级(四)事务 MVCC 日志 锁

InnoDB -> ACID 原子性(不可分割,完全成功或失败)、一致性、隔离性、持久性(redo) -> begin; commit

​ 还有自动提交、隐式提交的概念。保存点、

脏读(读到了其他事务未提交的修改数据)

不可重复读(读到了其他事务提交的数据)

幻读(新增数据导致其他事务未提交的数据)

​ 幻读产生原因:行锁只能锁住行,即使把所有的行记录都上锁,也阻止不了新插入的记录

处理方式:加锁、事务隔离、MVCC

加锁:

  1. 脏读:在修改时加排它锁,直到事务提交时释放;读取时加共享锁,读完释放。
  2. 不可重复读:读数据时加共享锁;写数据时加排它锁。
  3. 幻读:加范围锁

​ LBCC(Lock-Based Concurrent Control)

​ 共享锁(行锁):读锁 -> 防止别人修改资源,多人可以读,多人可以加锁 select xx LOCK IN SHARE MODE
​ 排它锁(行锁):写锁 -> 仅自身可以增删改查,别人不能任何加锁操作(可以读) select xx FOR UPDATE
​ 意向锁:表锁 -> 提高加锁的效率,识别是否有读锁写锁

​ !已存在的记录值开始锁!
​ 记录锁:查询命中一条记录
​ 间隙锁:查询区间记录,锁区间
​ 临键锁:左开右闭区间
​ 自增锁:innodb_autoinc_lock_mode

事务隔离:

​ 读未提交、读已提交、可重复读、串行化
在这里插入图片描述

MVCC

​ (Multi-Version Concurrency Control) 多版本并发控制

事务id是在更新的时候生成的,查询的时候不会生成事务id

read-view是在select的时候生成的,是整个库的快照,未提交事务的id数组,和已创建的最大事务id(无论是否提交)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当前读:

​ 当前读:!修改的时候,先读后写!。(当前读可能存在幻读、快照读不存在)防止其他事务的修改丢失

select...lock in share mode (共享读锁)
  select...for update
  update , delete , insert

当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题

例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。

快照读

​ 快照读(read-view):mysql在一定程度上解决了幻读 -> 由执行查询时所有未提交事务ID数组和已创建的最大事务ID组成

单纯的select操作,不包括 select ... lock in share mode, select ... for update

Read Committed隔离级别:每次select都生成一个快照读。

Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读。

可重复读的事务下,read-view是在整个session中的select过程中不变的。
undo回滚日志 + 记录版本链
read-view -> 隔离级别:
读已提交:当前存在的最新版本的数据
可重复读:当前事务开启之前的最后一个版本状态

行锁:锁的是什么?

​ InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。

mysql几种日志:

binlog(sql)

​ 以事件的形式记录,默认关闭,不会记录select和show操作。

undo log(反向操作日志)逻辑型日志

​ <trx_id、Y、9> 事务trx_id对Y进行了修改,修改前Y的值是9。(一致性)

在这里插入图片描述

redo log(某一页的数据)物理型日志

​ <trx_id、X、V> 事务trx_id将V存储到数据库元素X。(原子性、持久性)
​ 方便记录、等不忙的时候在持久化。满了持久化之后清除;真实物理修改
​ update的时候,直接修改buffer pool里的数据 (脏页),然后生成redo log,redo log持久化,然后返回修改成功

​ 保证原子性:Innodb的undo log回滚日志
​ 保证持久性:Innodb的redo log

在这里插入图片描述

relay log

error log

慢日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 实现 MVCC(Multi-Version Concurrency Control)是通过使用 undo log 和 read view 来实现的。 MVCC 的工作原理是在数据库中维护多个版本的数据,并且每个事务只能看到在其开始时间点之前已经提交的数据版本。这样可以实现并发事务之间的隔离性,避免了常见的读写冲突。 具体实现步骤如下: 1. Undo Log:每当更新数据时,MySQL 会先将旧版本的数据保存到一个特殊的日志文件中,称为 undo log。如果事务需要回滚,则可以使用 undo log 进行数据恢复。 2. Read View:在每个事务开始时,会创建一个 read view。read view 记录了事务开始时刻数据库中的活跃事务列表,以及这些事务对应的 undo log。read view 可以确保事务只能看到在其开始时间点之前已经提交的数据版本。 3. 读操作:当一个事务执行读操作时,会首先检查数据版本是否可见。如果数据版本早于当前事务的开始时间,则该数据版本是可见的,否则需要等待其他事务进行提交。这样可以避免脏读和不可重复读的问题。 4. 写操作:当一个事务执行写操作时,首先会根据当前的数据版本生成一个新的数据版本,并将新版本的数据写入到数据库中。同时,会将旧版本的数据保存到 undo log 中。其他事务在读取数据时,会根据自己的 read view 来判断是否能够看到这个新的数据版本。 通过使用 undo log 和 read view,MySQL 实现了 MVCC,提供了高并发的事务处理能力,并保证了事务之间的隔离性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值