暂无图片
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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql怎么自定义执行时长?
回答 2
selectsleep(n)fromtable?  值得注意的是。这个执行时间 是n记录数。
比较大的.ibd文件恢复导致数据库崩了直接重启
回答 13
已采纳
undropforinnodb工具5.7高版本是可以解析的。但mysql8.0有点困难,可以是试试。
请问各位大佬,mysql,hadoop,es,redis国产化推荐用什么替代
回答 1
Mysql使用OpenGauss,OceanBase替代;ES使用Doris替代; Hadoop没有一对一的替代品,如果仅仅是HDFS,可以使用存储 开放协议的S3开源程序替代;分
关于net_buffer_length 的问题?
回答 2
1、netbufferlength是一个客户端连接级别的变量,而不是线程级别的内存。每个客户端连接都会为其分配一个缓冲区,该缓冲区的大小由netbufferlength决定。对于100个连接,默认情况
events_transactions_current ,再5.7中,有未提交的事务,但是却查不到
回答 2
https://dev.mysql.com/doc/refman/5.7/en/performanceschematransactiontables.htmlhttps://dev.mysql.com
mysql kill进程出现killed,一直挂着不释放怎么解?
回答 3
1、线程只是被标记killed,实际没有执行到判断线程状态的逻辑,需要等待进入判断线程状态后才进行后续操作2、终止逻辑耗时较长,像大事务回滚,大查询回滚,ddl后阶段回退。
xtrabackup可以用远程的备份文件恢复吗
回答 3
已采纳
xtrabackup不能远程备份,应该不可以远程恢复数据。
请问 MySQL 8 中 mysqladmin 无法生效,如图求解,有人知道吗?
回答 1
已采纳
mysqladmin执行应该是在shell端执行,登陆到mysql客户端执行当然不行了
linux下忘记root密码的修改方法失败,但是再windows下可以成功,请问咋回事?
回答 1
my.inf中添加skipgranttables,重新启动来重置密码,改好以后要把这个去掉。
如何消除 MySQL表中的字段特别设置的字符集和排序规则?
回答 2
mysql有语句可以重新指定全表字符集。CREATETABLEt1(idint(11)NOTNULLAUTOINCREMENT,serialnovarchar(50)CHARACTERSETutf8C