博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql间隙锁next-key
阅读量:7234 次
发布时间:2019-06-29

本文共 734 字,大约阅读时间需要 2 分钟。

如果在transaction1(Tr1)进行一个

select * from table1 where id < 4 lock in share mode.

这里会在table1上加一个next_key lock(间隙锁),基本原理是什么呢?大致是这样的,内存中有一个lock hash。是一个key(类似于tableid+pageid+offset)到value(所加的锁)--- 这就是行锁的原理。所以 id<4的话,会给0 1 2 4(假设当前数据库没有3)加上行锁,这样就保证了不会出现插入id=3.5这种事情的发生。

++++++++++++++++++++++++++++++++++++++++++

小插曲:

万圣节 问题
update table1 set c1=c1+2 where  c1<10; 如果使用index(c1)进行存取。
如果按照正常思路,取出第一条c1=1的将其+2,然后重新插入表中,同时要调整index(c1)。因为是按照索引顺序的一条一条的取出来的,
这样待会又会把刚刚更新过的数据,取出来再重新加了一次,导致错误的发生。----------这就是《万圣节问题》

解决方案:

使用RID list prefetch技术,先将要更改的数据取出来,放到一个temp table里面,每次取数据都是从temp table里面取,这样就不会重复的取出已经更新的数据了。

+++++++++++++++++++++++++++++++++++++++++++

所以 在transaction2(Tr2)进行一个

update table1 set id=5 where id=4;
会等待。。知道Tr1 commit之后才能更新成功。

转载地址:http://nslfm.baihongyu.com/

你可能感兴趣的文章
什么是css?
查看>>
webpack 打包多页面
查看>>
傻瓜式入门Redux
查看>>
最新图解 如何提升phpstudy中的mysql版本
查看>>
华山论剑之iOS&tableView的双剑合璧
查看>>
4K超清,2500万人在线,猫晚直播技术全解读
查看>>
编译时注解 ButterKnife源码分析和手写
查看>>
人人都能学会的python编程教程2:数据类型和变量
查看>>
iOS开发: CocoaPods远程私有仓库的维护-添加子库
查看>>
【Python3网络爬虫开发实战】3-基本库的使用-3正则表达式
查看>>
支持获取 6.0+设备正在运行程序信息
查看>>
使用 Acorn 来解析 JavaScript
查看>>
如何下载、安装eclipse
查看>>
流计算框架 Flink 与 Storm 的性能对比
查看>>
JavaScript数据类型AND深拷贝和浅拷贝的不归路
查看>>
iOS逆向之旅(进阶篇) — HOOK(FishHook)
查看>>
Gradle 3.0.0设置Apk文件输出命名
查看>>
mac 使用php storm的基本配置
查看>>
装饰者模式
查看>>
集成计算引擎在大型企业绩效考核系统的应用方案
查看>>