vlambda博客
学习文章列表

DB | MySQL核心知识学习之路(2)

【MySQL总结/Edison Zhou

作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第二篇,总结了MySQL的事务隔离级别。

1MySQL的事务隔离级别

所谓隔离,它源自于我们熟知的事务的ACID四大特性之一的Isolation隔离性。

在MySQL中,提供了如下四种事务的隔离级别:

  • 读未提交(Read Uncommitted)

    • 一个事务还未提交,它所做的变更就可以被别的事务看到

  • 读提交(Read Committed):默认隔离级别

    • 一个事务提交之后,它所做的变更才可以被别的事务看到

  • 可重复读(Repeatable Read)

    • 一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的

  • 串行化(Searializable)

    • 对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行

如上四种隔离级别,并行性能依次降低,安全性则依次提高!

在MySQL中,可以通过以下命令查看当前设置的事务隔离级别,默认隔离级别为读提交(Read Committed)。

show variables like 'transaction_isolation';

DB | MySQL核心知识学习之路(2)

2隔离级别小练习

现在我们来看一个小练习,假设我们通过以下语句创建一张表T,并向表T插入了一个新数值1:

mysql> create table T(int) engine=InnoDB;insert into T(c) values(1);

然后,看看如下所示的图片,假设有两个事务分别启动,看看在不同的隔离级别下不同事务查询得到的值V1、V2和V3分别是多少?

DB | MySQL核心知识学习之路(2)

图片来源:林晓斌《MySQL实战45讲》

(1)隔离级别=读未提交,V1=V2=V3=2

(2)隔离级别=读提交,V1=1,V2=V3=2

(3)隔离级别=可重复读,V1=V2=1,V3=2

(4)隔离级别=串行化,V1=V2=1,V3=2

3事务隔离的实现

在MySQL中,每条记录在更新的时候都会同时记录一条回滚操作。因此,记录上的最新的值,通过回滚操作,可以得到前一个状态的值。换句话说,同一记录在系统中可以存在多个版本这其实就是MySQL数据库的多版本并发控制(MVCC)

综述,可以说MySQL事务隔离的实现基础是基于多版本并发控制MVCC的,而具体的实现方式就是回滚日志。即每个事务的都会在自己的一致性读视图(Consistent Read View,这个视图没有物理结构,用来在事务执行期间定义“我能看到什么数据”)中对记录进行操作,并记录回滚日志,但是不同事务之间是不会冲突的。

鉴于此,由于长事务会存在很老的事务视图,在其未提交之前,可能用到的所有回滚记录都需要保留,会占用大量存储空间。所以,建议尽量不要使用长事务!

如果必须要用,那么需要对其进行监控,下面的语句可以指导我们查找时间超过60s的长事务:

-- 查找持续时间超过60s的长事务:select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
4事务的启动方式

在实践中,MySQL的事务启动方式有以下两种:

(1)显示启动事务(begin/start transaction -> commit/rollback)

(2)显示关闭自动提交(set autocommit=0)

5小结

本文总结了MySQL的事务隔离级别、实现方式 及 启动方式,可以帮助我们使用好MySQL的事务特性。


参考资料

林晓斌,《MySQL实战45讲》(推荐订阅学习)

👇扫码订阅《MySQL实战45讲》

DB | MySQL核心知识学习之路(2)

DB | MySQL核心知识学习之路(2)

年终总结:

数字化转型:

C#刷题:

技术管理:

商业知识:

.NET大会:


👇扫码关注EdisonTalk

不变的依旧是分享