前言:

       最近比较好奇,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的耗时了。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

让人无语的MySQL嵌套事务

      MySQL是支持嵌套事务的,但是没多少人会这么干的…. 前段时间在国外看到一些老外在争论MySQL嵌套事务的场景必要性。 逗死我了,...

阅读全文

评论已关闭。