DB | MySQL核心知识学习之路(2)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第二篇,总结了MySQL的事务隔离级别。
所谓隔离,它源自于我们熟知的事务的ACID四大特性之一的Isolation隔离性。
在MySQL中,提供了如下四种事务的隔离级别:
读未提交(Read Uncommitted)
一个事务还未提交,它所做的变更就可以被别的事务看到
读提交(Read Committed):默认隔离级别
一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读(Repeatable Read)
一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化(Searializable)
对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
如上四种隔离级别,并行性能依次降低,安全性则依次提高!
在MySQL中,可以通过以下命令查看当前设置的事务隔离级别,默认隔离级别为读提交(Read Committed)。
show variables like 'transaction_isolation';
现在我们来看一个小练习,假设我们通过以下语句创建一张表T,并向表T插入了一个新数值1:
mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);
然后,看看如下所示的图片,假设有两个事务分别启动,看看在不同的隔离级别下不同事务查询得到的值V1、V2和V3分别是多少?
图片来源:林晓斌《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
在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
在实践中,MySQL的事务启动方式有以下两种:
(1)显示启动事务(begin/start transaction -> commit/rollback)
(2)显示关闭自动提交(set autocommit=0)
本文总结了MySQL的事务隔离级别、实现方式 及 启动方式,可以帮助我们使用好MySQL的事务特性。
参考资料
林晓斌,《MySQL实战45讲》(推荐订阅学习)
👇扫码订阅《MySQL实战45讲》
年终总结:
数字化转型:
C#刷题:
技术管理:
商业知识:
.NET大会:
👇扫码关注EdisonTalk
不变的依旧是分享!