【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.3
【复现路径】假设发现客户端在执行一个超过1小时才能完成的操作。不想等待了,直接在客户端杀掉了进程。请问tidb server收不到客户端的数据包后,会有什么操作?
如果在执行复杂查询,查询会自动退出吗?
如果在执行大事务,事务会rollback吗?锁会自动释放吗?
1 个赞
在7.5之前版本,在客户端直接杀掉进程后会数据库还会继续完成语句。如果正在执行大事务, 如果是自动提交则会事务执行成功,如果非自动提交事务会rollback,锁会自动释放。
在7.5版本,客户端杀掉进程后,数据库直接终止,语句立刻被kill掉,事务会回滚,锁也会释放。
2 个赞
一直以为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的新特性点赞