锁机制

锁机制

一、什么是锁机制,为什么要用锁机制

我们可以通过一个很简单的比喻来理解事务的锁机制。比如同一个办公室的同事们,都想使用打印机打印文件,如果不加以控制,可能出现两个人同时打印不同的内容在一个文件里,就会引起内容混乱。于是,我们就引入了锁的概念,当有并发的多个事务同时操作同一份数据时,只有“抢到”了锁的事务,才能真正去操作数据,使得数据的安全性得到保证。

锁保证并发的多个事务同一时间只有一个能运行,会一定程度上降低程序的运行效率,但是能大大提升数据的安全性。

二、数据库锁的分类

1、按粒度分

数据库的锁按粒度分为行级锁,表级锁,页级锁

⾏级锁 ⾏级锁是Mysql中锁定粒度最细的⼀种锁,表示只针对当前操作的⾏进⾏加锁。⾏级锁能⼤⼤减少数据库操作的冲突。其加锁粒度最⼩,但加锁的开销也最⼤。⾏级锁分为共享锁和排他锁。

特点:开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼。

由于数据库的库和表都是事先建好的,所以我们针对数据库的操作一般都是针对记录。而对记录进行的四种操作(增删改查),我们可以分为两类,增删改属于读操作,而查询属于写操作。

写操作默认就会加锁,且加的是互斥锁,很容易理解,在进行写行为的时候一定是必须“排他”的。读操作默认不受任何锁影响,但是互斥锁和共享锁都可以加。

读操作加互斥锁 for update;

读操作加共享锁 lock in share mode;

提示:关于共享锁和互斥锁,我们将在下一小节更详细地讲述

行级锁锁的是索引,命中索引以后才会锁行,如果没有命中索引,会把整张表都锁

起来。

命中主键索引就锁定这条语句命中的主键索引,命中辅助索引就会先锁定这条辅

助索引,再锁定相关的主键索引

考虑到性能,innodb默认支持行级锁,但是只有在命中索引的情况下才锁行,

否则锁住所有行,本质还是行锁,但是此刻相当于锁表了

行级锁有三种算法:

Record lock

Gap lock

Next-key lock

其中 Next-key lock 为MySQL默认的锁机制,相当于另外两种锁的功能的整合,并能够解决幻读问题。

提示:在RR事务隔离机制下,才会锁间隙,而RR机制是mysql的默认事务隔离机制。所以,在默认情况下,其实innodb存储引擎锁的是行以及间隙.

我们可以用一个实验来验证上述关于行锁的结论

*实验*

111

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇

You cannot copy content of this page