InnoDB 行锁行锁介绍行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高 。
InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是采用了行级锁 。(两者是息息相关的)
事务事务及其ACID属性事务是由一组SQL语句组成的逻辑处理单元 。
事务具有以下4个特性,简称为事务ACID属性 。
ACID属性含义原子性(Atomicity)事务是一个原子操作单元,其对数据的修改,要么全部成功,要么全部失败 。一致性(Consistent)在事务开始和完成时,数据都必须保持一致状态 。隔离性(Isolation)数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的 “独立” 环境下运行 。持久性(Durable)事务完成之后,对于数据的修改是永久的 。并发事务处理带来的问题问题含义丢失更新(Lost Update)当两个或多个事务选择同一行,最初的事务修改的值,会被后提交的事务修改的值覆盖 。脏读(Dirty Reads)读到了另一个事务还未提交的数据不可重复读(Non-Repeatable Reads)一个事务执行同样的两次select语句,前后查询出来的结果不一致幻读(Phantom Reads)一个事务按照相同的查询条件重新读取以前查询过的数据,却发现其他事务插入了满足其查询条件的新数据 。幻读幻读:就像出现了“幻影”一般,原本查不到这个人,然后要插入的时候,突然又说这个人存在
- 场景:注册问题吧,查询某个主键id是否存在,第一次查询不存在,即将插入新数据时【刚好另一个人插入了该主键id】,导致这边注册失败
文章插图
- 幻读在“当前读”下才会出现 。
- 幻读仅专指“新插入的行”【update的不算】
数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏写、脏读、不可重复读、幻读这几类问题 。
隔离级别丢失更新脏读不可重复读幻读Read uncommitted×√√√Read committed××√√Repeatable read(默认)×××√Serializable(串行化)××××
备注 : √ 代表可能出现,× 代表不会出现。
- 读未提交:别人修改了某行数据,还未提交我们就能看到 。
- 读已提交:别人修改了某行数据,得等到提交后我们才能看到 。-- 解决脏读
- 可重复读:别人修改了某行数据,我们也不去读那一行数据,还是读我们当前事务最初的那个未被修改的值 。-- 解决不可重复读
- 串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁” 。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行 。
文章插图
- 读未提交:v1=v2=v3=2;B还未提交,A就可以看到了 。
- 读已提交:v1=1,v2=v3=2;等到B提交后,A才能看到 。
- 可重复读:v1=v2=1,v3=2;也就是说,所谓的可重复读,是说在当前事务提交之前,只会读取当前事务最初的值,而不去读取其他的事务;
- 串行化:v1=1,v2=1,v3=2;事务A中查询得到值1的时候,就会加了“读锁”,会阻塞其他事务对该行的写操作(上文我们已经有提及到相关的读锁和写锁,忘记了的小伙伴可以翻阅上文看看)所以在事务B执行“将1改成2”的时候,会被锁住 。直到事务A提交后,事务B才可以继续执行 。
经验总结扩展阅读
- 【MySQL】Navicat15 安装
- 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
- 31 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android系统中Flutter应用程序的包
- 「MySQL高级篇」MySQL索引原理,设计原则
- 我的世界怎么用附魔台附魔书(我的世界用高级附魔台怎么附魔)
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
- 30 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-番外篇
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
- 轻奢极简店名美甲 名字高级小众美甲店名
- llinux下mysql建库、新建用户、用户授权、修改用户密码