作者:z小赵
★一枚用心坚持写原创的“无趣”程序猿,在自身受益的同时也让朋友们在技术上有所提升。
目录
为什么需要锁?
MySQL 中锁分类?
什么是事务?
事务的隔离级别
MySQL 是怎么实现事务机制的?
MVCC 机制
总结
为什么需要锁?
相信大家都比较熟悉电商系统中库存管理的场景,对于日常活动促销、618、双 11 等场景,会在规定时间内对商品进行促销活动,假设现在有一款 HHKB 机械键盘要参与促销活动,数据库中准备了 10 件,促销活动开始时,多位买家开始争抢,每卖出一件商品,库存减 1,直到卖完,那么怎么能保证商品不会卖超呢?
对于以上这个场景来说,我们需要用到锁机制来保证每卖出一件商品,对库存进行更新操作时,其他用户请求不能对该商品库存进行修改;换句话说,用户 1 拿到了修改库存的锁,则只有用户 1 能修改数据,而用户 2 只能等着不能修改数据。如下图所示:
相反,如果没有锁的加持,用户 1 和用户 2 发现库存还有 1 件商品,同时都开始下单,用户 1 先将库存更新为 0,此时商品已经售完,而用户 2 也将库存更新为 0,就导致了卖超的尴尬情况。
MySQL 中锁分类?
锁根据使用场景不同,被分成了各种各样的锁。比如读写可以分为读锁和写锁,对于读请求之间相互是互不影响的,因为数据没有被所有,大家读取到的数据都是一样的,所以读锁也称之为共享锁;对于写请求,由于存在数据的变更,所以请求之间是互斥的,所以也称之为排它锁。
对于根据锁锁定的范围大小,可以分为全局锁、表锁、元数据锁、行锁:
全局锁:顾名思义就是对整个数据库进行加锁操作,加锁期间,整个数据库只能够进行读操作。
表锁:是对数据库中的某张表进行加锁,此时表与表之间可以同时进行写操作而互不影响,但是同一时刻同一张表只能有一个写操作。
页面锁:页面锁是介于表锁和行锁之间的一种锁,其优势是中和表锁和行锁的锁开销。
行锁:是对数据库表中的某一行进行加锁操