目录
InnoDB 锁类型
InnoDB MVCC简要
事务隔离级别
SQL加锁分析(主题)
死锁举例分析
InnoDB锁类型
InnoDB Lock Types
❖Shared and Exclusive Locks
❖Intention Locks
❖Record Locks
❖Gap Locks
❖Next-Key Locks
❖Insert Intention Locks
❖Auto-inc Locks
❖ Predicate Locks for Spatial Index(忽略)
InnoDB - S&X Locks
❖Row-Level Locking
❖S Locks (shared locks)
✓A shared (S) lock permits the transaction that holds the lock to read a row
✓Example: select * from xx where a=1 lock in share mode
❖X Locks ( Exclusive Locks)
✓An exclusive (X) lock permits the transaction that holds the lock to update or delete a row.
✓Example:select * from xx where a=1 for update
❖S 和 S 兼容, X 和 S 互斥, X和X互斥
InnoDB - S&X Locks举例例
❖select * from t where i=1 lock in share mode
![d3dd0749751d6df1b86aa49c80d07bed.png](https://i-blog.csdnimg.cn/blog_migrate/02930d52a29b81ef0704936ccdaa778e.png)
❖select * from t where i=1 for update
![62d68db6348fe3448a2489261b91770c.png](https://i-blog.csdnimg.cn/blog_migrate/bb6b2d958d6b203de87cbba5f2c4bd20.png)
插⼊入篇:如何查看SQL加锁信息
![6745723c6a9e679e4f1bd88e0ba4ec73.png](https://i-blog.csdnimg.cn/blog_migrate/aea873e1cf14e9f5d79fe9728f46bdca.png)
❖进⾏如下设置可以看到此SQL持有锁信息
✓SET GLOBAL innodb_status_output=ON;
✓SET GLOBAL innodb_status_output_locks=ON;
✓5.6.16版本引⼊此参数,影响性能,线上慎开
插⼊入篇:查看SQL加锁信息
![9f54507b45842802f6539bd6104034ba.png](https://i-blog.csdnimg.cn/blog_migrate/bb3bc9a5dcc6096aacbd298c1fce87a3.jpeg)
InnoDB - Intention Locks
❖InnoDB⽀持多粒度锁,允许⾏锁和表锁并存
❖Table-Level Locks
❖Intention shared Lock(IS) 意味着事务需要在表的⾏上⾯添加S锁,因此获取S锁之前需要获取IS锁
❖ Intention exclusive Lock(IX)意味着事务需要在表的⾏上⾯添加X锁,因此获取X锁之前需要获取IX锁
![e9eb1bd23152ffdc6ada98a3ec717827.png](https://i-blog.csdnimg.cn/blog_migrate/73e0a67d30782d691a91938b270884c8.png)
InnoDB - 兼容性
![76afad2cf4b56645d3a8c1741975e93c.png](https://i-blog.csdnimg.cn/blog_migrate/847893dd8e3811aaab45681807b12e51.png)
![ff8d90d1110a7cb18b7c604b4817a489.png](https://i-blog.csdnimg.cn/blog_migrate/77660d600f53d1f7d71de732153ca631.jpeg)
InnoDB - Record Locks
❖记录锁是对索引加锁,⽽不是具体的数据⾏
❖即使表没有定义索引,InnoDB产⽣隐藏聚簇索引⽤于加锁
![c44159b1ca20513cc3941ea3d1c98c92.png](https://i-blog.csdnimg.cn/blog_migrate/60feaa1dab22ddaef3638897fcf48f55.jpeg)
InnoDB - Gap Locks
❖A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.
❖A gap might span a single index value, multiple indexvalues, or even be empty.
❖Gap可能通过设置Read-Commited以及innodb_locks_unsafe_for_binlog进⾏显⽰关闭
InnoDB - Next-Key Locks
❖A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record.
![6d923049ea5f3340267cecd4cff0bf00.png](https://i-blog.csdnimg.cn/blog_migrate/7e79f8940373582b63cec3844e41da3b.png)
❖InnoDB 默认的事务隔离级别是REPEATABLE READ
❖在RR模式下, InnoDB 使⽤ next-key locks 防⽌幻读
![ae7b18701e81eb090e8077b8a4a289bc.png](https://i-blog.csdnimg.cn/blog_migrate/0f7a2207eac02b3d7bf0fee6d6883fc6.png)
InnoDB - Next-Key Locks举例例1
![f8087fe8ba04daa14539fc4f78c43278.png](https://i-blog.csdnimg.cn/blog_migrate/298982ed8b90eb20e6ee4d5bf412f487.jpeg)
InnoDB - Next-Key Locks举例例2
![9062d9a7921eb219db33651006386a91.png](https://i-blog.csdnimg.cn/blog_migrate/bc9545acfc4ef0fe8d8eb57fcd12b591.jpeg)
InnoDB - Insert Intention Locks
❖An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion.
![9da3072026665a9ac411881f567120dd.png](https://i-blog.csdnimg.cn/blog_migrate/7c205c0482ff152202a874c636f83323.jpeg)
![aad9eab5cfed204d87ba756fb12c92ec.png](https://i-blog.csdnimg.cn/blog_migrate/025f03f4c62c750333839ddabc55ba9d.png)
InnoDB - Insert Intention Locks
![5196e48de4c726162fafa011bb3648f4.png](https://i-blog.csdnimg.cn/blog_migrate/4e007cf45bfa4cb69b066c4704b63d56.jpeg)
InnoDB - AUTO-INC Locks
❖特殊的table-level lock
❖持有时间在当前sql执⾏完成就释放,⽽不是事务结束后才释放
❖通过参数innodb_autoinc_lock_mode控制,具体有三种模式:
AUTOINC_OLD_STYLE_LOCKING (0)
AUTOINC_NEW_STYLE_LOCKING (1) 保证Id连续,默认
AUTOINC_NO_LOCKING (2)
InnoDB - AUTO-INC Locks
AUTOINC_OLD_STYLE_LOCKING(0)
1)在分⽚片前加上AUTO_INC锁,并在SQL结束时释放掉
![5e0ba477397439a5b9d5db1e70e1277d.png](https://i-blog.csdnimg.cn/blog_migrate/9f625401a483eb6c3fb463a8c063eda6.png)
AUTOINC_NO_LOCKING (2)
1)只在分配时加个mutex即可很快就释放
2)在statement格式下不不能保证批量量插⼊入的复制安全性
InnoDB MVCC
数据库并发控制协议
1、基于锁的协议 (Lock Based Protocol)
2、基于多版本机制 (Multi-version Protocol)
3、基于时间的协议 (Time-Stamp Ordering Protocol)
4、基于图的协议 (Graph Based Protocol)
5、基于多粒度协议 (Multiple Granularity Protocol)
MVCC
❖多版本控制
❖相对于基于锁的协议,MVCC最⼤好处:读不加锁,读写不冲突
❖读操作
✓快照读(snapshot read)
✓当前读(current read)
快照读和当前读
❖快照读:简单select操作,不加锁
❖select * from table where ?
❖ 当前读: 特殊读操作,插⼊/更新/删除,需要加锁
❖select * from table where ? lock in share mode
❖select * from table where ? for update
❖insert into table values (…)
❖delete from table where ?
❖update table set ? where ?
InnoDB MVCC实现关键点
❖ROW记录格式
❖ROW和Undo关系
❖ReadView判断
InnoDB MVCC实现原理理-Row格式
![7cbbfea7b18ce0e4782eea41af8aa560.png](https://i-blog.csdnimg.cn/blog_migrate/35bec232405eb5aaef460fe13184a228.png)
实际上还有⼀个字段DB_ROW_ID,只出现在聚簇索引中
InnoDB MVCC实现原理理-Row和Undo
❖通过回滚段实现多个版本的读取
![d94332fe2d7fd0878b7af94dca707cd3.png](https://i-blog.csdnimg.cn/blog_migrate/b7f739b9783ae34faca82a0ad07e2c73.png)
InnoDB MVCC实现原理理-Read View
![a0c80c4955022535c5c7ed103e322585.png](https://i-blog.csdnimg.cn/blog_migrate/5fb8d82724c852a50e95ae36f3f81d34.jpeg)
InnoDB MVCC实现原理理-可⻅见性判断
![62ffd7f05e9b20c0bc99da89fbb9ca48.png](https://i-blog.csdnimg.cn/blog_migrate/3756af6fd91c526672b4a5eba54fb846.jpeg)
事务隔离级别
读现象问题
❖丢失更新 (事务ACID保证不会发⽣)
❖脏读
❖不可重复读
❖幻读
事务隔离级别
❖Read Uncommitted
✓可以读取未提交的事务,此隔离级别不会使⽤。
❖Read committed (RC)
✓针对当前读,RC隔离级别保证对读取到的记录加锁(⾏锁),存在幻读现象。
❖Repeatable Read(RR)
✓针对当前读,RR保证对读取到的记录加锁(⾏锁),同时保证对读取的范围加锁,新的满⾜查询条件的记录不能够插⼊(Next-Key Locks),不存在幻读现象。
❖Serializable
✓从MVCC并发控制退化为基于锁的并发控制。所有的读操作都为当前读,读加读锁(S锁),写加写锁(X锁)。Serializable隔离级别下,读写冲突,并发度急剧下降。
读现象和事务隔离级别举例例
![ea2f8538f2d4533495627166d7101b22.png](https://i-blog.csdnimg.cn/blog_migrate/799d7e4eefce7dc53ef8c6576c84c376.jpeg)
读现象举例例-脏读
❖脏读:当⼀个事务允许读取另⼀个事务修改但未提交的数据时,就可能发⽣脏读。
![29e5c9a617e2960fd8af3369aa0cc19f.png](https://i-blog.csdnimg.cn/blog_migrate/2e701dddd057c00164e55759f9830380.jpeg)
读现象举例例-不不可重复读
❖不可重复读:在⼀次事务中,当⼀⾏数据获取两遍得到不同的结果表⽰发⽣了“不可重复读”
![71380db53200cc57fed7a4859b255a88.png](https://i-blog.csdnimg.cn/blog_migrate/4e64e1bf9352375e37910287f0a6afe6.png)
读现象举例例-幻读
❖ 幻读:不可重复读的⼀种特殊场景。当事务1两次执⾏SELECT ... WHERE检索⼀定范围内数据的操作中间,事务2在这个表中创建了(如INSERT)⼀⾏新数据,这条新数据正好满⾜事务1的“WHERE”⼦句。
![8eaf68bd92597951b8368a35d04f472a.png](https://i-blog.csdnimg.cn/blog_migrate/77705e33fba7761b5c5307e0c70dc2ad.jpeg)
标准事务隔离级别
![6b035ad30d648ecd61f210b5fbb43240.png](https://i-blog.csdnimg.cn/blog_migrate/4642d7805f507291a9baec93efe88f05.jpeg)
❖标准事务隔离级别中RR没有解决幻读问题。
InnoDB在RR模式解决幻读问题举例例
![251101a906127417465873576c7c3221.png](https://i-blog.csdnimg.cn/blog_migrate/aae7de8fd77d2b3a4fa54b0f68256e1b.jpeg)
SQL加锁分析
❖简单SQL加锁分析
❖复杂SQL加锁分析
❖常见SQL加锁总结
Update操作加锁流程
![44fa0b45afa4f34411e6ad24ef6ebe88.png](https://i-blog.csdnimg.cn/blog_migrate/f826292647ddee30f226c2f5361feb7b.jpeg)
2PL:Two-Phase Locking
![ff51be7eb5ddf384c4849bb39821feca.png](https://i-blog.csdnimg.cn/blog_migrate/e6bf80628163dc6b9e7f9be2f10cfae4.jpeg)
一条简单SQL的加锁分析-问题
❖SQL1:select * from t1 where id = 10
✓MVCC多版本控制,Select 快照读,不加锁
❖SQL2: delete from t1 where id = 10
一条简单SQL的加锁分析-前提条件
❖前提⼀:id列是不是主键?
❖前提⼆:当前系统的事务隔离级别是什么?
❖前提三:id列如果不是主键,那么id列上是否有索引吗?
❖前提四:id列上如果有⼆级索引,那么这个索引是唯⼀索引吗?
❖前提五:SQL的执⾏计划是什么?索引扫描?全表扫描?
SQL加锁分析前提场景
❖组合⼀:id列是主键,RC事务隔离级别
❖组合⼆:id列是⼆级唯⼀索引,RC事务隔离级别
❖组合三:id列是⼆级⾮唯⼀索引,RC事务隔离级别
❖组合四:id列上没有索引,RC事务隔离级别
❖组合五:id列是主键,RR事务隔离级别
❖组合六:id列是⼆级唯⼀索引,RR事务隔离级别
❖组合七:id列是⼆级⾮唯⼀索引,RR事务隔离级别
❖组合⼋:id列上没有索引,RR事务隔离级别
❖组合九:Serializable事务隔离级别
组合⼀一:id主键+RC
![50637df92bc6b9044f64fee24dd725b5.png](https://i-blog.csdnimg.cn/blog_migrate/5b54dff48352a34deeb728eee25e26a1.jpeg)
组合⼆二:id唯⼀一索引+RC
![83b10ab10a3e5f3edd93d1a51a800f1d.png](https://i-blog.csdnimg.cn/blog_migrate/fa1ca4f842a5a3caf87794153ec735ae.jpeg)
![25ef332e3128400d30cee2e41e144ea2.png](https://i-blog.csdnimg.cn/blog_migrate/7a22353c2d805f9e4b8751d1f9c0393d.jpeg)
![101535ffa5bceb2cfce6060051d29ee7.png](https://i-blog.csdnimg.cn/blog_migrate/e38f2672c64706111614d5aab696cc42.jpeg)
![83f8281645f33d282a289434c5773c54.png](https://i-blog.csdnimg.cn/blog_migrate/303a7a38d1c97e732ed846efe0481111.jpeg)
![d67bdd0529c401367e63c5636181982d.png](https://i-blog.csdnimg.cn/blog_migrate/2082ec9773276c5503e943064a76d81b.jpeg)
![b58b520c0fe15e9de7de0a35119214f1.png](https://i-blog.csdnimg.cn/blog_migrate/b5051a8244f8ce11801e97a9fd8eec3e.jpeg)
![e9559af2c5cdc76acf1e0c49a101ef31.png](https://i-blog.csdnimg.cn/blog_migrate/96f997a8ee03ea20b497b5ab79526563.jpeg)
![52caa73d0d7c2f70383b9d18885e2a42.png](https://i-blog.csdnimg.cn/blog_migrate/4d3286d660729ad3a0f6756082964d07.jpeg)
![2d44416ae51ba5707bbdadb0f4b49210.png](https://i-blog.csdnimg.cn/blog_migrate/0f50beecafc4f048ab0364eb98a9b13c.jpeg)
![af328758e5cda488e8bf71eda61208ac.png](https://i-blog.csdnimg.cn/blog_migrate/69954103b9e85123459c7f30f657e485.jpeg)
![31c13f07a9753a6d0901331f6507744b.png](https://i-blog.csdnimg.cn/blog_migrate/2a16eec964131426cffdc5d46188bb69.jpeg)
![17ffcc53e601708c63144910ad6792af.png](https://i-blog.csdnimg.cn/blog_migrate/092cec480f716b14a49d80c7e010b1b2.jpeg)
![1694aa00ed4c16180ccbfc5778d1a8ad.png](https://i-blog.csdnimg.cn/blog_migrate/aa8cc5ceb46ca4dc84b82b564add66cd.jpeg)
![56ee1ad3361e07b857e52f6c0854761e.png](https://i-blog.csdnimg.cn/blog_migrate/51d05b04fd3acc6237faaf37fa081dd6.jpeg)
![4c6008b04a91718c6dbcdf84ef9d576e.png](https://i-blog.csdnimg.cn/blog_migrate/c2b15505aedc3ac02815877457be02c1.jpeg)
![1ba8751accc7e3f45cb67c96f79103d8.png](https://i-blog.csdnimg.cn/blog_migrate/07041a2b7f426b3b8a9d51aebd936d11.jpeg)
![ed9de80ff03e8172a8dcdc314f1a9b90.png](https://i-blog.csdnimg.cn/blog_migrate/d23221875563c3f79212745e315f3810.jpeg)
复杂SQL加锁规则
![59e6b89c28e3533999de2c63c4f964af.png](https://i-blog.csdnimg.cn/blog_migrate/0c8e188fe0cb55f06e452016f660a62d.jpeg)
![396283f07a1e437da169f3722f34dc7d.png](https://i-blog.csdnimg.cn/blog_migrate/99b8433d3267163a5aa6ec6bdd237dab.jpeg)
![7d3a6dbefca6ac8f2b77ee20a867c65b.png](https://i-blog.csdnimg.cn/blog_migrate/0ab09182e2dcd4419e17a6c0ce52f499.jpeg)
![facdfa50db1b3e588a984ef91e09aa4d.png](https://i-blog.csdnimg.cn/blog_migrate/bb7b6cb6c73b4d9dc866dfbd2bcdc3df.jpeg)
![e09f86de347ed5ca171b7eeca74cf8b3.png](https://i-blog.csdnimg.cn/blog_migrate/915059b5ecab118ae6dac64d26200064.jpeg)
![fd7e7e039774e1fbd04798f9e34cfb64.png](https://i-blog.csdnimg.cn/blog_migrate/3d4aa81ebe95aae5c6526a74aafcada3.jpeg)
![7ac6aa3b1286eae564ed8405959f9907.png](https://i-blog.csdnimg.cn/blog_migrate/bfbaa8e829d7ff21dd205b0c4323e2d7.jpeg)
![408bc7daf8fab4ba1bc35a5d4edb7b9a.png](https://i-blog.csdnimg.cn/blog_migrate/4654ab2f2fd15b15118bd18bafc3570e.jpeg)
![2e27190c76d860c88f7ea2cddcc494e9.png](https://i-blog.csdnimg.cn/blog_migrate/04a791de00928f434cdd71d1588aae8d.jpeg)
![003405bfeee5149493f0de61b4f86e3d.png](https://i-blog.csdnimg.cn/blog_migrate/e4be63647c16e62c12e3f90680d5a798.jpeg)
![89050da42e336ea07b220435d21a62c9.png](https://i-blog.csdnimg.cn/blog_migrate/0a200866f96ed6415601f2048fd33120.jpeg)
![a44e367a397f5461a4a2f66a150f6a05.png](https://i-blog.csdnimg.cn/blog_migrate/3de5dbc60ef5609934f6d83ef453ae64.jpeg)
![8b2b12aeb16f12895ca84c4164c0952c.png](https://i-blog.csdnimg.cn/blog_migrate/707d6fd8cfe26269a989b9bdd614b9d5.jpeg)
![eb5cffd7e8c01486355c51ba34eb0c67.png](https://i-blog.csdnimg.cn/blog_migrate/9c8df78ef7ae88833627c68aaaa9309c.jpeg)
![3e03083416f885ce048d4a1d1195573b.png](https://i-blog.csdnimg.cn/blog_migrate/b99eb175d22013e570b012736e3f9813.jpeg)
![3077d99a54633b330d3e4448d08b1a83.png](https://i-blog.csdnimg.cn/blog_migrate/93c9d7492c0d0f93339dca60fada0915.jpeg)
![505f6e0b6076493892385ca10b80aea8.png](https://i-blog.csdnimg.cn/blog_migrate/5a5b6ebfa8db33d2112784c6f49b82be.jpeg)
![4adc1a0f8ae0095a7d96f52eac5c60db.png](https://i-blog.csdnimg.cn/blog_migrate/031591b724912cc21929bac71e34ed24.jpeg)
![57d94f2c26983623971abdac5667a4d6.png](https://i-blog.csdnimg.cn/blog_migrate/9d6afcaa872b4de5cdd62ac280b9c8ba.jpeg)
![e015215bdaf74bd8f0df1af783911923.png](https://i-blog.csdnimg.cn/blog_migrate/d2f23f1cdb95505e669ebebb4890c7a9.jpeg)
![198d9b55c60104775cb45dc1290e47f6.png](https://i-blog.csdnimg.cn/blog_migrate/3e1aec5db5f9de556459415372e734d2.jpeg)
![8dd952596bff093b44a8f8a315e07565.png](https://i-blog.csdnimg.cn/blog_migrate/92b7a1d2ac615c044c3719f283db814f.jpeg)
![ad22093f9b7b2950641a10443380af30.png](https://i-blog.csdnimg.cn/blog_migrate/78258bbdafdf619dfc332ac42ec171b0.jpeg)
![38f0c5745b2da9044c7aa8eff4cd54b0.png](https://i-blog.csdnimg.cn/blog_migrate/3c32de2b4901f679a96bacbc190d5bb1.jpeg)
![91e6b005a9ad4d8e1a868f74c4c056a8.png](https://i-blog.csdnimg.cn/blog_migrate/8a3330b82f447f0dbba5df2fea351490.jpeg)
![bdd2fb4778dc94b3aa7d474dc99dd46b.png](https://i-blog.csdnimg.cn/blog_migrate/16048131264269ef2edc5e02c51a3c1b.jpeg)
![9fb44b975be0dbb070abae491c011d0f.png](https://i-blog.csdnimg.cn/blog_migrate/2da0d746ce885fb46c649e6c11370964.jpeg)
![dc75e93ef6e9e45f44f8cfcc04b314c0.png](https://i-blog.csdnimg.cn/blog_migrate/7c463948f8db44da50ef76c817f05349.jpeg)
![49e008194f43c6d1c0e73067bb058bd4.png](https://i-blog.csdnimg.cn/blog_migrate/1435acfc26a475e8fdc58c431544b379.jpeg)
![4f10486fcf0c1b4e96af2f6b1d9ff33b.png](https://i-blog.csdnimg.cn/blog_migrate/744e6b8709e75a741f202ce05d29931c.jpeg)
![b0285b6726e53f7eaaa25f3ca05402a7.png](https://i-blog.csdnimg.cn/blog_migrate/c3d9ae79e20a933b1f9f63fb360217a5.jpeg)
![6bda9714775a7ea6ac3b72e2e5302c1a.png](https://i-blog.csdnimg.cn/blog_migrate/c32e635546f813e556e354635906abee.jpeg)
声明
作者:一个人的Code
链接: https:// blog.csdn.net/weixin_41 850404/article/details/84653909
来自:csdn