暂无图片
ddl没有阻塞dml的问题
我来答
分享
暂无图片 匿名用户
ddl没有阻塞dml的问题

--sess1 

begin;


alter table tt add column c3 int,algorithm=copy,lock=exclusive;


---sess 2

begin;

insert into  tt(id) values(300) ;

理论2应该被阻塞,处于等待,但是我在5.7上测试没有达到效果,

请问怎么理解?

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
龙镇君

在你描述的场景中,ALTER TABLE操作在sess1中执行,同时sess2尝试在tt表中插入数据。在MySQL 5.7中,由于ALTER TABLE的实现方式,sess2的INSERT操作可能不会被立即阻塞,而是在原表上执行。当ALTER TABLE完成时,新表成为tt的当前版本,而sess2的INSERT可能已经完成,其影响被“合并”到新表中。

然而,这种行为并不意味着ALTER TABLE没有锁定,而是锁的实现方式在并发操作中表现得更为复杂。实际上,sess2的INSERT操作可能在ALTER TABLE完成时才真正影响到数据的最终状态,而不是在INSERT执行时立即反映。

为了观察阻塞行为,你可以尝试使用ALGORITHM = INPLACE,这将更严格地使用表锁,阻止所有对表的并发写操作,直到ALTER TABLE完成。然而,需要注意的是,ALGORITHM = INPLACE在某些情况下可能会导致更长的阻塞时间,因为它不允许在操作过程中读写原表。

此外,在高并发的环境中,使用ALGORITHM = COPY虽然可以减少阻塞,但可能会消耗更多的磁盘空间,因为需要存储原表和新表的副本。因此,在选择ALTER TABLE的算法时,需要权衡阻塞时间和资源消耗。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏