技术标签: MySQL高级 mysql binglog 可重复读 幻读 事务
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `c` (`c`)
) ENGINE=InnoDB;
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);
begin;
select * from t where d=5 for update;
commit;
select ... for update
:
非索引字段
进行 update
或 select .. for update
操作,代价极高。所有记录上锁,以及所有间隔的锁索引字段
进行上述操作,代价一般。只有 索引字段 本身和 附近的间隔 会被加锁select ... for update
是为了在查询时,对这条数据进行加锁,避免其他用户以该表进行插入、修改或删除等操作,造成表的不一致性关于 “这个语句会命中
d=5
的这一行,对应的主键id=5
,因此在 select 语句执行完成后,id=5 这一行会加一个写锁,而且由于两阶段锁协议,这个写锁会在执行 commit 语句的时候释放” 这句话的理解由于字段 d 上没有索引,因此这条查询语句会做全表扫描。那么,其他被扫描到的,但是
不满足
条件的 5 行记录上,会不会被加锁呢?
RR (可重复读)
级别:扫描到的数据都会加 行锁 和 间隙锁RC (读提交)
级别:扫描到的数据都会加行锁,但是不满足条件的数据,没有到 commit 阶段,就会被释放,违反了两阶段加锁原则InnoDB 的默认隔离级别是 可重复读
share in mode
:当前读,给数据加读锁
for update
:当前读,给数据加写锁
什么是幻读 ?
幻读
和 不可重复读
幻读
是针对 insert
导致的数据不一致不可重复读
是针对 delete
、update
导致的数据不一致可重复读
隔离级别下,事务内查询用 “当前读”,读到本事务外新增的数据,称为 幻读IX
锁、IS锁
才可能出现的,是用户主动打破业务层面上的查询时的一致性视图隔离性可见性规则问题
(可见性规则是来解决各种事务问题的),而是用户在使用上出现的问题,属于业务问题
什么是
快照读
? 什么是当前读
?
当前读
指的是 select for update
或者 select in share mode
,指的是在更新之前必须先查询当前的值,因此叫当前读快照读
指的是在语句执行之前或者在事务开始的时候会创建一个视图,后面的读都是基于这个视图的,不会再去查询最新的值当前读 具体包括哪些操作 ?
for update
、lock in share mode
、update
、delete
、insert
都是当前读的规则,就是读取最新的已经提交的数据update
先查询再修改,这里的查询就是使用的当前读delete
要先查询再删除,这里的查询也是要当前读insert
的时候,要判断主键是否已经存在、是否违反唯一约束,此时查看主键是否存在的查询也是当前读幻读 和 脏读 的区别 ?
读提交
的隔离级别下,没有讨论幻读的实际意义可重复读
隔离级别下,当前读
打破了视图的隔离限制,实现了读到不应该读的数据的作用在
可重复读
的隔离级别下,幻读只会在查询为哪种性质时才会出现 ?
一致性视图
的作用,因此幻读只会在 “当前读
” 情况下发生幻读 跟 事务的可见性规则 冲突吗 ?
可重复读
隔离级别下,幻读是用户选择使用 当前读
而产生的,符合 当前读 的规则,也不跟事务的 可见性规则
相矛盾
select .. lock in share mode
和select ... for update
的区别 ?
select .. lock in share mode
走的是 IS锁(意向锁)
共享锁
,这样的话,其他 session
可以读取这些记录,也可以继续添加 IS 锁
,但是无法修改这些记录直到你这个加锁的 session
执行完成 (否则直接锁等待超时)select ... for update
走的是 IX锁 (意向排它锁)
IS锁
或 IX锁
不存在 一致性非锁定读
的话,那么其他 session 是无法读取和修改这些记录的innoDB 存在 非锁定读
(快照读并不需要加锁),for update
之后并不会阻塞其他 session 的快照读取操作select ...lock in share mode
和 select ... for update
这种显示加锁的查询操作for update
的加锁方式无非是比 lock in share mode
的方式多阻塞了select...lock in share mode
的查询方式,并不会阻塞快照读幻读 产生的原因 ?
binlog
日志是在 commit
提交时才进行记录的幻读
行锁
binlog
里面,执行序列是这样的:insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/
update t set d=100 where d=5;/*所有d=5的行,d改成100*/
update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/
(0,5,5)
。所以,id=0 这一行的问题解决了id=1
这一行,在数据库里面的结果是 (1,5,5)
,而根据 binlog
的执行结果是 (1,5,100)
,也就是说 幻读 的问题还是没有得到解决
T3
时刻,我们给所有行加锁的时候,id=1
这一行还不存在,不存在也就加不上锁如何解决
幻读
?
行锁
的基础上,引入了 间隙锁 (Gap Lock)
insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);
行锁 和 行锁 之间会产生冲突,那 间隙锁 和 间隙锁 之间,也会产生冲突吗 ?
读锁之间不冲突
,写锁与读锁冲突
,写锁与写锁冲突
间隙锁
存在冲突
关系的,是 “往这个间隙中插入一个记录” 这个操作什么是
next-key lock
?
间隙锁
和 行锁
合称 next-key lock
,每个 next-key lock
是前开后闭
区间select * from t for update
要把整个表所有记录锁起来,就形成了 7 个 next-key lock
,分别是 (-∞,0]
、(0,5]
、(5,10]
、(10,15]
、(15,20]
、(20, 25]
、(25, +supremum]
开区间
前开后闭
区间不存在
的最大值
,也就是 +supremum
引入 间隙锁 后,可能会导致什么问题 ?
A事务
随机查询某一条数据(+排它锁,也就是 for update
)的方式产生间隙锁B事务
也执行同一条SQL,随后 A事务 判定数据不存在时,对其插入,B事务也同样如此操作,则最终导致 A事务 等待 B事务 的间隙锁,B事务 也在等待 A事务 的间隙锁,这将导致死锁除了引入
间隙锁
, 还有什么方式可以解决幻读
?
RR (可重复读)
改为 RC (读提交)
,则不存在幻读问题binlog
格式改为 row
,否则可能出现 数据 和 日志 不一致的问题为什么
RC (读提交)
下,需要将binlog
格式改为row
呢 ?
更新
时事务A
的记录会把 事务B
的记录也进行更新,这就导致了数据恢复错误row
格式,binlog
会具体记录语句的各项条件,这样在恢复时便不会恢复错误了statement
记录的是这个删除的语句delete from t where age>10 and modified_time<='2020-03-04' limit 1;
row
格式记录的是实际受影响的数据是真实删除行的主键iddelete from t where id=3 and age=12 and modified_time='2020-03-05';
-- statemnt格式
begin;
update t set d=5 where id=0;
commit;
-- row格式
begin;
update t where id=0 and c=0 and d=0
set id=0,c=0,d=5
commit;
关于row格式的参考资料
大家都用
读提交
,可是逻辑备份
的时候,mysqldump
为什么要把备份线程
设置成可重复读
呢 ?
mysqldump
mysqldump
使用参数 –single-transaction
的时候,导数据之前就会启动一个事务,来确保拿到一致性视图RR (可重复读)
的一致性读视图可以保证 数据备份时,不阻塞其他数据写入在备份期间,
备份线程
用的是可重复读
,而业务线程
用的是读提交
。同时存在两种事务隔离级别,会不会有问题 ?
读提交
还是 可重复读
,都是 MVCC 支持一条加了
排它锁
的查询语句,如果查询是全表扫描,那么扫描过的语句会如何 ?
可重复读
隔离级别下,MySQL 会对扫过的语句加 next-key lock
重复读
更新时采用 当前读
,这是为了防止数据丢失当前读
,可能造成更新层面语义的破坏
和 日志数据 不一致
的问题更新层面
的 幻读
问题,可重复读
时,引入了 next-key lock
读提交
,则解决了语义层面的破坏
,但需要通过将 binlog
改为 max
或 row
的形式,防止日志数据不一致文章浏览阅读301次。这个问题在我初学js的时候就一直傻傻分不清楚,当时只大概知道有的可以操作字符串、有的可以操作数组、有的可以截取、有的可以插入、有的还能删除,有的是参数截取长度、有的参数是结束位置、有的参数可以是负数、有的不能接受负数参数······用的时候全靠试,瞎猫遇见死耗子,试对了就写上了,用了这么些年了,你要让我一一说出他们的特点,我还真的想一会儿。相信很多同学跟我一样,为了可以更好的记住他们,今天我来好好..._js中slice,substring,substr,splice区别
文章浏览阅读3.9k次。http://blog.swine123.com/archives/905.htmlSecureCRT无法连接上服务器了,重启了ssh服务,service sshd restart,依然不行。[root@localhost ~]# ssh [email protected]_exchange_identification: Connection closed by remote h_mac无法ssh到redhat8服务器
文章浏览阅读388次。足球机器人排成一排向球门发起射击,但守门员却并没有准备防守,而是一屁股倒在地上开始胡乱摆动起了双腿。然后,前锋跳了一段十分令人困惑的舞蹈,跺跺脚,挥挥手...
文章浏览阅读5.4k次,点赞2次,收藏4次。Issue:============== Code ===============================================import open3d as o3dpcd = o3d.io.read_point_cloud("apple_object_50.pcd")print("Downsample the point cloud with a voxel of 0.05")downpcd = pcd.voxel_down_sample(voxel_size=0_attributeerror: 'open3d.cpu.pybind.geometry.pointcloud' object has no attrib
文章浏览阅读942次。1、robot 下运行 cmdOperatingSystem.Run${a} OperatingSystem.Run C:/Users/MC/Desktop/testbaidu/EOC_Test/power_off${power_port}.bat运行bat文件涉及的命令 如果需要路径 注意设置环境变量转载于:https://www.cnblogs.com/classi..._operatingsystem.run
文章浏览阅读662次。欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好..._2018年终工作总结
文章浏览阅读2.5k次,点赞6次,收藏4次。这篇文章将总结在Qt 6中Qt Network模块的最新更新和修改,以及未来可能的发展方向。_qt6 cmake 添加network
文章浏览阅读1.7w次,点赞2次,收藏8次。1、问题发生原因:我遇到这个问题是因为在之前安装了ceph-0.94.6的环境中重新安装ceph-10.2.5,只是卸载了ceph的包,没有对ceph的一些配置文件进行删除。[root@node-1 tmp]# ceph-deploy new node-1[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeplo_admin_socket: exception getting command descriptions: [errno 2] no such file
文章浏览阅读390次。华为自主研发的取代安卓系统的鸿蒙OS早在2016年就开始研发,后来因为谷歌功能被限制使用之后,华为宣布了自己的替代方案,鸿蒙OS系统。不过从华为官方发布了鸿蒙OS之后,华为手机却一直迟迟没有将鸿蒙OS公开,所以外界一直怀疑华为的鸿蒙OS能够代替安卓系统是华为吹的牛。不过细心的网友发现,华为鸿蒙OS已经开始在部分华为手机用户上升级安装,并且安装成功之后的鸿蒙OS的操作界面和安卓系统完全不同。有不少华..._鸿蒙电脑系统界面
文章浏览阅读908次。常用博客:(IT行业)博客园CSDNO’REILLY(English)找到一个超级好的下载正统的地方MSDN,我告诉你Windows Server 2003下载的密钥点击这里Windows Server 2003 R2, Enterprise x64 Edition with SP2 - Disc 2 - VL (Simplified Chine_windows server 2003 r2, standard x64 edition with sp2 - disc 1 - vl (simplif
文章浏览阅读533次。我们接着上一小节继续官方教程:投票应用第3节:视图和模板 | 第4节:表单和通用视图我们的投票应用中,我们需要下列几个视图:问题索引页——展示最近的几个投票问题。问题详情页——展示某个投票的问题和不带结果的选项列表。问题结果页——展示某个投票的结果。投票处理器——用于响应用户为某个问题的特定选项投票的操作。编写更多的视图polls/views.pydef detail(r..._django 3 4
文章浏览阅读9.5k次。numpy的基本用法(六)——numpy array的copy_numpy.array中的copy