不在事务中能加锁吗_MySQL各种加锁案例分析

目录

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

❖select * from t where i=1 for update

62d68db6348fe3448a2489261b91770c.png

插⼊入篇:如何查看SQL加锁信息

6745723c6a9e679e4f1bd88e0ba4ec73.png

❖进⾏如下设置可以看到此SQL持有锁信息
✓SET GLOBAL innodb_status_output=ON;
✓SET GLOBAL innodb_status_output_locks=ON;
✓5.6.16版本引⼊此参数,影响性能,线上慎开

插⼊入篇:查看SQL加锁信息

9f54507b45842802f6539bd6104034ba.png

InnoDB - Intention Locks

❖InnoDB⽀持多粒度锁,允许⾏锁和表锁并存
❖Table-Level Locks
❖Intention shared Lock(IS) 意味着事务需要在表的⾏上⾯添加S锁,因此获取S锁之前需要获取IS锁
❖ Intention exclusive Lock(IX)意味着事务需要在表的⾏上⾯添加X锁,因此获取X锁之前需要获取IX锁

e9eb1bd23152ffdc6ada98a3ec717827.png

InnoDB - 兼容性

76afad2cf4b56645d3a8c1741975e93c.png

ff8d90d1110a7cb18b7c604b4817a489.png

InnoDB - Record Locks

❖记录锁是对索引加锁,⽽不是具体的数据⾏
❖即使表没有定义索引,InnoDB产⽣隐藏聚簇索引⽤于加锁

c44159b1ca20513cc3941ea3d1c98c92.png

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

❖InnoDB 默认的事务隔离级别是REPEATABLE READ
❖在RR模式下, InnoDB 使⽤ next-key locks 防⽌幻读

ae7b18701e81eb090e8077b8a4a289bc.png

InnoDB - Next-Key Locks举例例1

f8087fe8ba04daa14539fc4f78c43278.png

InnoDB - Next-Key Locks举例例2

9062d9a7921eb219db33651006386a91.png

InnoDB - Insert Intention Locks

❖An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion.

9da3072026665a9ac411881f567120dd.png

aad9eab5cfed204d87ba756fb12c92ec.png

InnoDB - Insert Intention Locks

5196e48de4c726162fafa011bb3648f4.png

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

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

实际上还有⼀个字段DB_ROW_ID,只出现在聚簇索引中

InnoDB MVCC实现原理理-Row和Undo

❖通过回滚段实现多个版本的读取

d94332fe2d7fd0878b7af94dca707cd3.png

InnoDB MVCC实现原理理-Read View

a0c80c4955022535c5c7ed103e322585.png

InnoDB MVCC实现原理理-可⻅见性判断

62ffd7f05e9b20c0bc99da89fbb9ca48.png

事务隔离级别

读现象问题

❖丢失更新 (事务ACID保证不会发⽣)
❖脏读
❖不可重复读
❖幻读

事务隔离级别

❖Read Uncommitted
✓可以读取未提交的事务,此隔离级别不会使⽤。
❖Read committed (RC)
✓针对当前读,RC隔离级别保证对读取到的记录加锁(⾏锁),存在幻读现象。
❖Repeatable Read(RR)
✓针对当前读,RR保证对读取到的记录加锁(⾏锁),同时保证对读取的范围加锁,新的满⾜查询条件的记录不能够插⼊(Next-Key Locks),不存在幻读现象。
❖Serializable
✓从MVCC并发控制退化为基于锁的并发控制。所有的读操作都为当前读,读加读锁(S锁),写加写锁(X锁)。Serializable隔离级别下,读写冲突,并发度急剧下降。

读现象和事务隔离级别举例例

ea2f8538f2d4533495627166d7101b22.png

读现象举例例-脏读

❖脏读:当⼀个事务允许读取另⼀个事务修改但未提交的数据时,就可能发⽣脏读。

29e5c9a617e2960fd8af3369aa0cc19f.png

读现象举例例-不不可重复读

❖不可重复读:在⼀次事务中,当⼀⾏数据获取两遍得到不同的结果表⽰发⽣了“不可重复读”

71380db53200cc57fed7a4859b255a88.png

读现象举例例-幻读

❖ 幻读:不可重复读的⼀种特殊场景。当事务1两次执⾏SELECT ... WHERE检索⼀定范围内数据的操作中间,事务2在这个表中创建了(如INSERT)⼀⾏新数据,这条新数据正好满⾜事务1的“WHERE”⼦句。

8eaf68bd92597951b8368a35d04f472a.png

标准事务隔离级别

6b035ad30d648ecd61f210b5fbb43240.png

❖标准事务隔离级别中RR没有解决幻读问题。

InnoDB在RR模式解决幻读问题举例例

251101a906127417465873576c7c3221.png

SQL加锁分析

❖简单SQL加锁分析
❖复杂SQL加锁分析
❖常见SQL加锁总结

Update操作加锁流程

44fa0b45afa4f34411e6ad24ef6ebe88.png

2PL:Two-Phase Locking

ff51be7eb5ddf384c4849bb39821feca.png

一条简单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

组合⼆二:id唯⼀一索引+RC

83b10ab10a3e5f3edd93d1a51a800f1d.png

25ef332e3128400d30cee2e41e144ea2.png

101535ffa5bceb2cfce6060051d29ee7.png

83f8281645f33d282a289434c5773c54.png

d67bdd0529c401367e63c5636181982d.png

b58b520c0fe15e9de7de0a35119214f1.png

e9559af2c5cdc76acf1e0c49a101ef31.png

52caa73d0d7c2f70383b9d18885e2a42.png

2d44416ae51ba5707bbdadb0f4b49210.png

af328758e5cda488e8bf71eda61208ac.png

31c13f07a9753a6d0901331f6507744b.png

17ffcc53e601708c63144910ad6792af.png

1694aa00ed4c16180ccbfc5778d1a8ad.png

56ee1ad3361e07b857e52f6c0854761e.png

4c6008b04a91718c6dbcdf84ef9d576e.png

1ba8751accc7e3f45cb67c96f79103d8.png

ed9de80ff03e8172a8dcdc314f1a9b90.png

复杂SQL加锁规则

59e6b89c28e3533999de2c63c4f964af.png

396283f07a1e437da169f3722f34dc7d.png

7d3a6dbefca6ac8f2b77ee20a867c65b.png

facdfa50db1b3e588a984ef91e09aa4d.png

e09f86de347ed5ca171b7eeca74cf8b3.png

fd7e7e039774e1fbd04798f9e34cfb64.png

7ac6aa3b1286eae564ed8405959f9907.png

408bc7daf8fab4ba1bc35a5d4edb7b9a.png

2e27190c76d860c88f7ea2cddcc494e9.png

003405bfeee5149493f0de61b4f86e3d.png

89050da42e336ea07b220435d21a62c9.png

a44e367a397f5461a4a2f66a150f6a05.png

8b2b12aeb16f12895ca84c4164c0952c.png

eb5cffd7e8c01486355c51ba34eb0c67.png

3e03083416f885ce048d4a1d1195573b.png

3077d99a54633b330d3e4448d08b1a83.png

505f6e0b6076493892385ca10b80aea8.png

4adc1a0f8ae0095a7d96f52eac5c60db.png

57d94f2c26983623971abdac5667a4d6.png

e015215bdaf74bd8f0df1af783911923.png

198d9b55c60104775cb45dc1290e47f6.png

8dd952596bff093b44a8f8a315e07565.png

ad22093f9b7b2950641a10443380af30.png

38f0c5745b2da9044c7aa8eff4cd54b0.png

91e6b005a9ad4d8e1a868f74c4c056a8.png

bdd2fb4778dc94b3aa7d474dc99dd46b.png

9fb44b975be0dbb070abae491c011d0f.png

dc75e93ef6e9e45f44f8cfcc04b314c0.png

49e008194f43c6d1c0e73067bb058bd4.png

4f10486fcf0c1b4e96af2f6b1d9ff33b.png

b0285b6726e53f7eaaa25f3ca05402a7.png

6bda9714775a7ea6ac3b72e2e5302c1a.png

声明

作者:一个人的Code
链接: https:// blog.csdn.net/weixin_41 850404/article/details/84653909
来自:csdn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值