抓包分析mysql的事务提交过程

前言:

       最近比较好奇,mysql在执行事务的时候,begin会跟第一条sql一起批量发送,还是分别发送到mysql ? 我这里先把验证的结果说下,一组sql事务里的 begin; sql; commit 会被发送三次IO,另外mysql本身是不支持这类批量发送。


该文章后续仍在不断的更新修改中, 请移步到原文地址  http://xiaorui.cc/?p=5394


为什么要关心这话题?

因为毕竟多了一次网络io操作,在一个低延迟要求较高的系统里,每个io都需要考虑优化。我们在开发中很大一个原则就是 能不用事务的就别用事务。

事务抓包测试

首先在mysql-cli端执行一个简单的事务流程。

在mysql端进行tcpdump抓包:

抓包结果:

我们发现 begin; sql; commit 一共发起了三个网络io交互。 上面的操作是把begin和sql这两个语句分别发送的,那么如果在mysql-cli直接 批量发送begin和sql一起执行,会出现什么? 

这组事务操作还是被分成三组io交互。 mysql-cli会把命令进行分号;分割,然后循环发送。 

我们再换一个python的mysql库包试试,是否可以把事务的begin和sql一起发送。

通过tcpdump抓包也是可以看到异常信息,说明 mysql压根就不支持这类的批量发送。


总结:

    使用事务也要考虑下io rtt的耗时了。


对Golang感兴趣的朋友可以加群: 278517979 !!!
另外如果大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码, 感谢!
另外再次标注博客原地址  xiaorui.cc