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

本文共 802 字,大约阅读时间需要 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之后才能更新成功。

转载于:https://www.cnblogs.com/jack204/archive/2012/07/07/2581020.html

你可能感兴趣的文章
这个季节的忧伤,点到为止
查看>>
mysql通过配置文件进行优化
查看>>
省级网站群建设关注点
查看>>
工作第四天之采集资源
查看>>
innobackupex 在增量的基础上增量备份
查看>>
Windows Server 2012 R2 DirectAccess功能测试(2)App1服务器安装及配置
查看>>
基于清单的启动器的实现
查看>>
外网用户通过citrix打印慢的解决方法
查看>>
STL容器的使用
查看>>
关于std::map
查看>>
JXL导出Excel文件兼容性问题
查看>>
VBoot1.0发布,Vue & SpringBoot 综合开发入门
查看>>
centos7 安装wps 后 演示无法启动
查看>>
git简单命令
查看>>
LAMP编译部署
查看>>
XenDesktop7.6安装部署入门教程
查看>>
HashMap的工作原理及HashMap和Hashtable的区别
查看>>
GregorianCalendar日历程序
查看>>
Sublime 中运行 Shell 、Python、Lua、Groovy...等各种脚本
查看>>
【Java集合源码剖析】ArrayList源码剖析
查看>>