Mysql-各种锁区分与MVCC的详解
技术百科
黄舟
发布时间:2017-03-02
浏览: 次 mysql的锁貌似有很多啊,查了大部分资料,
什么表锁,行锁,页锁
共享锁,排他锁,意向锁,读锁,写锁
悲观锁,乐观锁。。
我去,真想问一句,有没有 金锁?我还范冰冰呢。。。
哎呀怎么感觉好乱啊。那么把它好好整理总结下吧。
后边还有对在innodb下的mvcc理解与举例,在并发量的访问下如何保持高效一致?简单易懂了解下,听朋友说大公司面试也爱问这个。
表/行/页-锁:
表级锁(table-level locking):MyISAM和MEMORY存储引擎
行级锁(row-level locking) :InnoDB存储引擎
页面锁(page-level-locking):BDB存储引擎
表级锁:开销小,并发低,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度也最低。
行级锁:开销大,并发高,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
共享/排他锁
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
Mysiam锁模式
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求.只有当读锁释放后才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
innodb锁模式
意向锁是InnoDB自动加的,不需要用户干预。
对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。
共享锁: SELECT ... LOCK IN SHARE MODE;
排他锁: SELECT ... FOR UPDATE;
MVCC(Multiversion concurrency control)
一个很难懂得概念,查阅了很多资料与博客,下边做一个简单易懂的理解。
情景模拟:
在高并发的前提下,一定要注意这个前提。
事务L1修改某表中D的key值,还未提交;
事务L2同样也修改D的key值,提交;然后L1提交。
发生了什么?
L1从D读取key:123对应的值100
L2从D读取key:123对应的100
L1对值增加1,将key:123更新为100 + 1
L2对值增加2,将key:123更新为100 + 2
如果L1和L2串行执行,key:123对应的值将为103,但上面并发执行中L1的执行效果完全被L2所覆盖,实际key:123所对应的值变成了102。就因为L1事务没提交呢,L2又来了。
那如何处理呢?
方法一:
加锁呗。前边不都是在说这个锁的问题呢,把他加写锁,等L1执行完再执行L2。可以是可以,但是发生了排队,并发下降了。这是一种悲观一般把基于锁的并发控制机称成为悲观机制。
方法二:
为了实现可串行化,同时避免锁机制存在的各种问题,我们可以采用基于多版本并发控制(Multiversion concurrency control,MVCC)思想的无锁并发机制,终于把要说的引出来了!人们一般把基于锁的并发控制机称成为悲观机制(悲观锁),而把MV
CC等机制称为乐观机制(乐观锁)。加入版本号的一个机制,由D维护该版本号,每次数据有更新就增加版本号,通过版本号来更加高效的管理事务一致性与高并发的问题。
因为锁机制是一种预防性的,读会阻塞写,写也会阻塞读,当锁定粒度较大,时间较长是并发性能就不会太好;而MVCC是一种后验性的,读不阻塞写,写也不阻塞读,等到提交的时候才检验是否有冲突,由于没有锁,所以读写不会相互阻塞,从而大大提升了并发性能。
以上就是mysql-各种锁区分与mvcc的详解的内容,更多相关内容请关注(www.)!
# 是在
# 是一种
# 我还
# 也不
# 也会
# 来了
# 才会
# 都不
# 死锁
# mysql
# 加锁
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac的访达(Finder)怎么用_Mac文件管理
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- 如何使用Golang实现微服务状态监控_Golan
- 如何自定义Windows终端的默认配置文件?(Po
- Python文本编码与解码_跨平台解析说明【指导】
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- Windows10如何更改任务栏高度_Win10解
- c++怎么用jemalloc c++替换默认内存分
- Windows10系统怎么查看显卡型号_Win10
- Win11文件扩展名怎么显示 Win11查看文件后
- Win11键盘快捷键大全_Windows 11常用
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- c++中的std::conjunction和std
- Windows如何拦截2345弹窗广告_Windo
- Win11怎么设置默认PDF阅读器 Win11修改
- Win11怎么设置任务栏图标大小_Windows1
- Windows资源管理器总是卡顿或重启怎么办?(修
- Win11如何连接Xbox手柄 Win11蓝牙连接
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Python解释执行模型_字节码流程说明【指导】
- Python文件操作优化_大文件与流处理解析【教程
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- php修改数据怎么批量改状态_批量更新status
- PHP 中 require() 语句返回值的用法详
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Win11怎么调整屏幕亮度_Windows 11调
- Win11怎么查看显卡温度 Win11任务管理器查
- Win11怎么设置右键刷新选项_Windows11
- 如何使用Golang配置安全开发环境_防止敏感信息
- LINUX怎么设置系统语言_LINUX修改中文环境
- 如何使用Golang benchmark测量函数延
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Mac如何设置动态壁纸?(让桌面动起来)
- 如何在 Windows 11 中使用 AlomWa
- Win11怎么设置按流量计费_Win11限制后台流
- Windows如何使用注册表查找和删除项?(reg
- Win11如何设置文件权限 Win11 NTFS文
- 如何使用Golang实现文件加密_Golang c
- 如何在Golang中写入JSON文件_保存结构体数
- Win11怎么设置系统还原_Windows11系统
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- PythonPandas数据分析项目教程_时间序列
- Win11怎么开启专注模式_Windows11时钟
- 如何使用Golang构建简易投票统计功能_Gola
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win11怎么开启游戏模式_Win11优化游戏帧数
- windows系统找不到无线网络怎么办_windo
- Python列表推导式与字典推导式教程_简化代码高
- 如何使用Golang写入二进制文件_Golang

QQ客服