MySQL事务及锁机制大揭秘 - 公开课笔记

Spring事务和数据库事务有什么区别?

Spring提供了一个类,由这个类以AOP的方式管理,只需要@Transactional即可

为什么要有事务?

事务的基本概念:要不然全成功,要不然全失败,为了保证一致性。
MySQL事务及锁机制大揭秘 - 公开课笔记
转账的步骤需要3条语句:查询A账户,A账户减去,增加B账户
跨行转账:分布式事务

一些处理机制:2阶段提交、3阶段提交…

ACID

原子性 一致性 隔离性 持久性
MySQL事务及锁机制大揭秘 - 公开课笔记
每个特点底层实现的原理是什么?

原子性

事务中的所有操作作为一个整体,像原子一样不可分割,通过undolog 回滚日志实现
undolog 存在哪里?
MySQL事务及锁机制大揭秘 - 公开课笔记
log有几种?
binlog, undolog, redolog, relaylog, errorlog, slowlog

MySQL可以看做是分为3层
(查询缓存在8.0之后就没有了)
MySQL事务及锁机制大揭秘 - 公开课笔记
只有innodb存储引擎有 redolog,undolog
所有存储引擎都有binlog,errorlog,relaylog,slowlog

既然有binlog,为什么还需要redolog,undolog?
因为在mysql刚开始诞生的时候,并没有innodb引擎,用的是myisam引擎,它不支持事务。
innodb引擎后来被创造之后,一开始是以插件的形式运行的,但是在5.5版本之后,默认使用的是innodb存储引擎。

如何在操作数据之前,将数据备份到一个地方?
MySQL事务及锁机制大揭秘 - 公开课笔记
undolog,使用反逻辑,根据逻辑计算出实际的值,而不需要在每一个状态的时候都存储一份数据。
相当于:(实际上不是这样存储的)
MySQL事务及锁机制大揭秘 - 公开课笔记
undolog是否需要落盘?

隔离

并发操作,两个人同时操作同一个数据,加锁
加什么锁?间隙锁?乐观锁?共享锁?排它锁?

持久性

数据一旦发生了更新,一定要溢写到磁盘。下次读数据的时候,一定要和上一次是一样的。
持久性通过redolog和binlog共同保证

持久性实现原理:redolog

MySQL事务及锁机制大揭秘 - 公开课笔记
MySQL事务及锁机制大揭秘 - 公开课笔记
innodb_flush_log_at_trx_commit参数:
0:如果在0.9秒,MySQL服务崩了,会丢失1秒的数据。服务器断电,该丢都丢。如果只是MySQL进程挂了,依然会给你写到磁盘中去。
1:如果在0.9秒,MySQL服务崩了,不会丢数据。每次提交都直接写磁盘,做到数据足够安全,但是会带来性能问题。
2:
为什么要有redolog?直接写数据不行吗?

WAL——Write Ahead Log溢日志
以下三种方法都不能做到严格不丢数据,都有可能丢失1秒钟数据。
批量操作的时候,不是每一次都提交事务,而是分批提交。
如果插了900条,剩下100条突然断电了,重启之后,可以使用redolog继续写
MySQL事务及锁机制大揭秘 - 公开课笔记
redolog相当于一个增量存储,redolog满了之后,会进行持久化的同步归档。然后将redolog清空。
MySQL事务及锁机制大揭秘 - 公开课笔记
MySQL事务及锁机制大揭秘 - 公开课笔记
undo和redo的执行顺序?
MySQL事务及锁机制大揭秘 - 公开课笔记

隔离级别

读未提交,读已提交,可重复度,序列化
不同的隔离级别可能导致不同的并发异常,如下图:
MySQL事务及锁机制大揭秘 - 公开课笔记
不可重复读:同一个事务可能读到不同的数据

MVCC:multi version concurrency control 多版本并发控制

脏读是指一个事务读取到其他事务已修改未提交的内容,不可重复读是值 读到其他事务已经提交的内容
不可重复读
幻读 跟 不可重读读,操作一样,只不过一个是修改,一个是插入

read view

用undolog实现MVCC:
所以undolog还是要存磁盘,所以到底要不要存?
MySQL事务及锁机制大揭秘 - 公开课笔记
MySQL有多少种锁?
MySQL事务及锁机制大揭秘 - 公开课笔记

自增锁:id=10,插入10条失败,下一次从21开始