【MySQL】深入浅出剖析mysql事务锁机制 - 笔记 - Go语言中文社区

【MySQL】深入浅出剖析mysql事务锁机制 - 笔记


事务的基本概念

在这里插入图片描述

事务的特点(ACID)

在这里插入图片描述
快照:之前的某一个历史的状态(类比虚拟机的快照),用于实现原子性
隔离性:通过锁机制来实现
:共享锁,排它锁,独占锁,临键锁,间隙锁,自增锁,意向锁
持久性:使用来实现
WAL日志:write ahead log,预写日志
Hbase主要操作内存,因为速度快。也是用WAL来保证数据不丢失。
数据在内存中,然后通过fsync写进磁盘。
一致性:是数据库的根本追求。

事务的特点

在这里插入图片描述

MySQL主要有3种日志:redolog,undolog,binlog(其他还有relaylog,slowlog慢查询日志)
binlog是归属server的,无论什么存储引擎,都有这个log
redolog,undolog是归属innodb的,如果换成myisam,就不存在这两种log

原子性实现原理:Undo log

在这里插入图片描述

逻辑日志:数据是统一放在磁盘里的,要想读取,需要拉取到内存(一次读取的最小逻辑单元的单位是),页的大小和操作系统相关,innodb默认一次读取16kb的数据。逻辑日志是对当前的sql语句做一次记录。
物理日志:物理日志表示修改当前页的数据。

MVCC:multipart version concurrency control 多版本并发控制
B修改时,A可以通过undolog读取历史数据

持久性实现原理:Redo log

在这里插入图片描述

数据的存储 :当前进程内存->操作系统内存->磁盘

电脑启动完成之后,所有的硬件设备交由内核来控制,用户空间要与内核交互,才能访问设备的资源。

kafka通过零拷贝、顺序读写,减少了内存复制,直接写进磁盘中

以下:考虑到不同的时候可能断电,这三种方式的安全性 1>2>0,默认是使用1
在这里插入图片描述

在这里插入图片描述
做n次数据的修改,并不是每一次都直接写进磁盘中。会先写进内存,内存占用达到一定阈值之后才写进磁盘中。

如何理解redolog?
redolog文件是循环存储的

在这里插入图片描述

在这里插入图片描述

Mysql隔离级别

在这里插入图片描述

默认隔离级别:
MySQL:可重复读
Oracle:读已提交
在这里插入图片描述
脏读:读没提交的数据

在这里插入图片描述

RC (READ COMMITTED)读更新之后的快照数据,永远是最新的快照
RR (REPEATABLE READ)读当前事务开启之前的快照数据

在一个表中,有2个用户不可见的列:createtimedeletetime(存的是当前事务的id值,而不是时间戳)

读数据的时候,读取的是createtime小于等于当前事务id,并且deletetime为空或deletetime大于等于当前事务id的数据

间隙锁是否能解决幻读问题?
间隙锁:给某一个范围加锁。

select * from table1 for update
锁的是索引
在这里插入图片描述

在这里插入图片描述
select * 是全表扫描,没有使用索引
在这里插入图片描述
表级锁和行级锁辨析:
在这里插入图片描述

如下图,innodb可以主动探知到死锁

在这里插入图片描述
如果设置了自增id,即使插入失败,id也会增加。
同样,使用duplicate update语句时,即使走的是update,也会让id增加。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/sinat_42483341/article/details/105519884
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢