本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/server_kill_idle_transaction.html 在上一篇文章里我们写了如何针对InnoDB清理空闲事务《如何杀掉空闲事务》
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/server_kill_idle_transaction.html
在上一篇文章里我们写了如何针对InnoDB清理空闲事务《如何杀掉空闲事务》,在@sleebin9 的提示下,这个功能不仅可以针对InnoDB,也可以用于所有MySQL的事务引擎。
如何在Server层实现呢,sql/sql_parse.cc的do_command()函数是个好函数,连接线程会循环调用do_command()来读取并执行命令,在do_command()函数中,会调用my_net_set_read_timeout(net, thd->variables.net_wait_timeout)来设置线程socket连接超时时间,于是在这里可以下手。
主要代码:
<span style="color: #0000dd;">830</span> <span style="color: #ff0000; font-style: italic;">/* 831 This thread will do a blocking read from the client which 832 will be interrupted when the next command is received from 833 the client, the connection is closed or "net_wait_timeout" 834 number of seconds has passed 835 */</span> <span style="color: #0000dd;">836</span> <span style="color: #ff0000; font-style: italic;">/* Add For Kill Idle Transaction By P.Linux */</span> <span style="color: #0000dd;">837</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span>thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>active_transaction<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008000;">)</span> <span style="color: #0000dd;">838</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">839</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span>thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_idle_timeout</span> <span style="color: #000080;">></span> <span style="color: #0000dd;">0</span><span style="color: #008000;">)</span> <span style="color: #0000dd;">840</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">841</span> my_net_set_read_timeout<span style="color: #008000;">(</span>net, thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_idle_timeout</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #0000dd;">842</span> <span style="color: #008000;">}</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span>thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_readonly_idle_timeout</span> <span style="color: #000080;">></span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">&&</span> thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>is_readonly_trx<span style="color: #008000;">)</span> <span style="color: #0000dd;">843</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">844</span> my_net_set_read_timeout<span style="color: #008000;">(</span>net, thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_readonly_idle_timeout</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #0000dd;">845</span> <span style="color: #008000;">}</span> <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span>thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_changes_idle_timeout</span> <span style="color: #000080;">></span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">&&</span> <span style="color: #000040;">!</span>thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>is_readonly_trx<span style="color: #008000;">)</span> <span style="color: #0000dd;">846</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">847</span> my_net_set_read_timeout<span style="color: #008000;">(</span>net, thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">trx_changes_idle_timeout</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #0000dd;">848</span> <span style="color: #008000;">}</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">849</span> my_net_set_read_timeout<span style="color: #008000;">(</span>net, thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">net_wait_timeout</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #0000dd;">850</span> <span style="color: #008000;">}</span> <span style="color: #0000dd;">851</span> <span style="color: #008000;">}</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">{</span> <span style="color: #0000dd;">852</span> my_net_set_read_timeout<span style="color: #008000;">(</span>net, thd<span style="color: #000040;">-</span><span style="color: #000080;">></span>variables.<span style="color: #007788;">net_wait_timeout</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #0000dd;">853</span> <span style="color: #008000;">}</span> <span style="color: #0000dd;">854</span> <span style="color: #ff0000; font-style: italic;">/* End */</span>
大家看明白了吗?其实这是偷梁换柱,本来在这里是要设置wait_timeout的,先判断线程是不是在事务里,就可以转而实现空闲事务的超时。
trx_idle_timeout 控制所有事务的超时,优先级最高
trx_changes_idle_timeout 控制非只读事务的超时
trx_readonly_idle_timeout 控制只读事务的超时
效果:
root@localhost : <span style="color: #66cc66;">(</span>none<span style="color: #66cc66;">)</span> 08:<span style="color: #cc66cc;">39</span>:<span style="color: #cc66cc;">49</span><span style="color: #66cc66;">></span> <span style="color: #993333; font-weight: bold;">set</span> autocommit <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> ; Query OK<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span> rows affected <span style="color: #66cc66;">(</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">)</span> root@localhost : <span style="color: #66cc66;">(</span>none<span style="color: #66cc66;">)</span> 08:<span style="color: #cc66cc;">39</span>:<span style="color: #cc66cc;">56</span><span style="color: #66cc66;">></span> <span style="color: #993333; font-weight: bold;">set</span> trx_idle_timeout <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">5</span>; Query OK<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span> rows affected <span style="color: #66cc66;">(</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">)</span> root@localhost : <span style="color: #66cc66;">(</span>none<span style="color: #66cc66;">)</span> 08:<span style="color: #cc66cc;">40</span>:<span style="color: #cc66cc;">17</span><span style="color: #66cc66;">></span> <span style="color: #993333; font-weight: bold;">use</span> perf <span style="color: #993333; font-weight: bold;">Database</span> changed root@localhost : perf 08:<span style="color: #cc66cc;">40</span>:<span style="color: #cc66cc;">19</span><span style="color: #66cc66;">></span> <span style="color: #993333; font-weight: bold;">insert</span> <span style="color: #993333; font-weight: bold;">into</span> perf <span style="color: #66cc66;">(</span>info <span style="color: #66cc66;">)</span> <span style="color: #993333; font-weight: bold;">values</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'11'</span><span style="color: #66cc66;">)</span>; Query OK<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span> row affected <span style="color: #66cc66;">(</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">)</span> root@localhost : perf 08:<span style="color: #cc66cc;">40</span>:<span style="color: #cc66cc;">26</span><span style="color: #66cc66;">></span> <span style="color: #993333; font-weight: bold;">select</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">from</span> perf; ERROR <span style="color: #cc66cc;">2006</span> <span style="color: #66cc66;">(</span>HY000<span style="color: #66cc66;">)</span>: MySQL server has gone away No connection<span style="color: #66cc66;">.</span> Trying <span style="color: #993333; font-weight: bold;">to</span> reconnect<span style="color: #66cc66;">...</span> Connection id: <span style="color: #cc66cc;">6</span> Current <span style="color: #993333; font-weight: bold;">database</span>: perf <span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">----+------+</span> <span style="color: #66cc66;">|</span> id <span style="color: #66cc66;">|</span> info <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">----+------+</span> <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> aaaa <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> aaaa <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> aaaa <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">----+------+</span> <span style="color: #cc66cc;">3</span> rows <span style="color: #993333; font-weight: bold;">in</span> <span style="color: #993333; font-weight: bold;">set</span> <span style="color: #66cc66;">(</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">)</span>
完整的patch这里下载:
Note: There is a file embedded within this post, please visit this post to download the file.

WindowsServerBackup是WindowsServer操作系统自带的一个功能,旨在帮助用户保护重要数据和系统配置,并为中小型和企业级企业提供完整的备份和恢复解决方案。只有运行Server2022及更高版本的用户才能使用这一功能。在本文中,我们将介绍如何安装、卸载或重置WindowsServerBackup。如何重置Windows服务器备份如果您的服务器备份遇到问题,备份所需时间过长,或无法访问已存储的文件,那么您可以考虑重新设置WindowsServer备份设置。要重置Windows

随着互联网的发展,SEO(SearchEngineOptimization,搜索引擎优化)已经成为了网站优化的重要一环。如果您想要使您的PHP网站在搜索引擎中获得更高的排名,就需要对SEO的内容有一定的了解了。本文将会介绍如何在PHP中实现SEO优化,内容包括网站结构优化、网页内容优化、外部链接优化,以及其他相关的优化技巧。一、网站结构优化网站结构对于S

随着电子商务和企业管理的发展,许多企业开始寻找更好的方法来处理其日常业务流程。ERP系统是一种能够整合企业各种业务流程的软件工具。它提供了全面的功能,包括生产、销售、采购、库存、财务等方面,帮助企业提高效率、控制成本和提高客户满意度。而在PHP编程语言中,也能够实现ERP系统,这就需要我们掌握一些基本的知识和技术。下面,我们将深入探讨如何在PHP中实现ERP

在发布WindowsServer的build26040版本之际,微软公布了该产品的官方名称:WindowsServer2025。一同推出的,还有Windows11WindowsInsiderCanaryChannel版本的build26040。有些朋友可能还记得,多年前有人成功将WindowsNT从工作站模式转换为服务器模式,显示微软操作系统各版本之间的共性。尽管现在微软的服务器操作系统版本和Windows11之间有明显区别,但关注细节的人可能会好奇:为什么WindowsServer更新了品牌,

随着物联网技术的发展和普及,越来越多的应用场景需要使用PHP语言进行物联网开发。PHP作为一种广泛应用于Web开发的脚本语言,它的易学易用、开发速度快、可扩展性强等特点,使其成为开发物联网应用的一种优秀选择。本文将介绍在PHP中实现物联网开发的常用技术和方法。一、传输协议和数据格式物联网设备通常使用TCP/IP或UDP协议进行数据传输,而HTTP协议是一个优

随着企业的发展,客户管理变得越来越重要。为了提高客户满意度和忠诚度,越来越多的企业采用客户关系管理系统(CRM)来帮助其管理客户关系。而PHP是一种流行的编程语言,因其简单易学、灵活和强大而被广泛应用于Web开发。那么,如何在PHP中实现CRM系统呢?本文将为您介绍实现CRM系统的步骤和技巧。Step1:需求分析在开始开发CRM系统之前,您需要进行需求分析

如何修改nginx默认的名称,可以稍微的伪装一下,也可以装x一般来说修改3个位置,一个是nginx.h、另一个是ngx_http_header_filter_module.c、还有一个ngx_http_special_response.c。提示:一般修改都是在nginx编译之前修改,修改完了之后需要重新编译代码如下:scr/core/nginx.conf#definenginx_version"1.4.7"#definenginx_ver"nginx/"n

微软在面向桌面端发布Win11预览版更新的同时,今天还发布了WindowsServer长期服务通道(LTSC)预览版Build25335。微软和以往相同,并未公布完整的更新日志,甚至于没有提供相应的博客文章。微软调整了WindowsServer预览版更新日志,让其和Canary频道版本相同,如果没有引入新的内容,则不放官方博文。IT之家注:Server的品牌尚未更新,在预览版中仍为WindowsServer2022。此外,微软将这些版本称为WindowsServervNext,而不是已经上市的W


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version
Visual web development tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 Mac version
God-level code editing software (SublimeText3)

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),
