假设mysql客户端进程被杀

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.3
【复现路径】假设发现客户端在执行一个超过1小时才能完成的操作。不想等待了,直接在客户端杀掉了进程。请问tidb server收不到客户端的数据包后,会有什么操作?
如果在执行复杂查询,查询会自动退出吗?
如果在执行大事务,事务会rollback吗?锁会自动释放吗?

1 个赞

在7.5之前版本,在客户端直接杀掉进程后会数据库还会继续完成语句。如果正在执行大事务, 如果是自动提交则会事务执行成功,如果非自动提交事务会rollback,锁会自动释放。
在7.5版本,客户端杀掉进程后,数据库直接终止,语句立刻被kill掉,事务会回滚,锁也会释放。

2 个赞

:flushed:一直以为kill之后,数据会终止执行并回滚,原来7.5之前不会回滚啊

1 个赞

在数据库server中使用kill命令没问题,在客户端直接终止程序不行,之前提过需求,不过终于在7.5实现了。

1 个赞

好的改进。

哦哦,那就是kill是正常的,如果只是关闭客户端,是不生效的。这其实是符合预期的。

学习了。以前了解是 ,客户端停止后,系统会继续执行,直到发现session断了后,会自动回滚,释放锁,但是挺慢的。

oracle用plsql developer就是,如果你直接点击中断,会回滚,但是如果你直接杀掉plsql developer,就会执行下去。

1 个赞

plsql developer默认不是自动提交事务的,意思是执行下去,如果是有事务的,会锁数据的

大佬,请教一下,tidb服务端是怎么感知到client已经断了的,这个跟tcp长连接有关吗

主要依赖于心跳(Heart-Beat)消息或TCP协议的KeepAlive保活机制

客户端其实发送了命令到服务端执行了,所以客户端杀了,之前不会回滚。

学习了

那不是你设置的问题吗,不管提交与否,你执行的那条sql是要执行完的。

这种bug影响很大,修复的很好

大佬,客户端和服务端之间有heartbeat吗?

TCP协议的KeepAlive机制

明白了,感谢大佬解答

学习了。感谢大佬解答

V6.5版本的客户端重启了,但是tidb还会继续执行,只能手工kill,给7.5的新特性点赞