在Server层实现Kill Idle Transaction
本文内容遵从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.

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Wie implementiert man die doppelte WeChat-Anmeldung auf Huawei-Mobiltelefonen? Mit dem Aufkommen der sozialen Medien ist WeChat zu einem unverzichtbaren Kommunikationsmittel im täglichen Leben der Menschen geworden. Viele Menschen können jedoch auf ein Problem stoßen: Sie können sich gleichzeitig auf demselben Mobiltelefon bei mehreren WeChat-Konten anmelden. Für Huawei-Mobiltelefonbenutzer ist es nicht schwierig, eine doppelte WeChat-Anmeldung zu erreichen. In diesem Artikel wird erläutert, wie eine doppelte WeChat-Anmeldung auf Huawei-Mobiltelefonen erreicht wird. Erstens bietet das EMUI-System, das mit Huawei-Mobiltelefonen geliefert wird, eine sehr praktische Funktion – das doppelte Öffnen von Anwendungen. Durch die doppelte Öffnungsfunktion der Anwendung können Benutzer gleichzeitig

WindowsServerBackup ist eine Funktion des WindowsServer-Betriebssystems, die Benutzern dabei helfen soll, wichtige Daten und Systemkonfigurationen zu schützen und vollständige Sicherungs- und Wiederherstellungslösungen für kleine, mittlere und große Unternehmen bereitzustellen. Nur Benutzer, die Server2022 und höher ausführen, können diese Funktion nutzen. In diesem Artikel erklären wir, wie Sie WindowsServerBackup installieren, deinstallieren oder zurücksetzen. So setzen Sie die Windows Server-Sicherung zurück: Wenn Sie Probleme mit der Sicherung Ihres Servers haben, die Sicherung zu lange dauert oder Sie nicht auf gespeicherte Dateien zugreifen können, können Sie die Sicherungseinstellungen Ihres Windows Servers zurücksetzen. Um Windows zurückzusetzen

So implementieren Sie die WeChat-Klonfunktion auf Huawei-Mobiltelefonen Mit der Popularität sozialer Software und der zunehmenden Bedeutung von Datenschutz und Sicherheit rückt die WeChat-Klonfunktion allmählich in den Mittelpunkt der Aufmerksamkeit der Menschen. Die WeChat-Klonfunktion kann Benutzern helfen, sich gleichzeitig bei mehreren WeChat-Konten auf demselben Mobiltelefon anzumelden, was die Verwaltung und Nutzung erleichtert. Es ist nicht schwierig, die WeChat-Klonfunktion auf Huawei-Mobiltelefonen zu implementieren. Sie müssen lediglich die folgenden Schritte ausführen. Schritt 1: Stellen Sie sicher, dass die Version Ihres Mobiltelefonsystems und die WeChat-Version den Anforderungen entsprechen. Stellen Sie zunächst sicher, dass die Version Ihres Huawei-Mobiltelefonsystems sowie die WeChat-App auf die neueste Version aktualisiert wurden.

Die Programmiersprache PHP ist ein leistungsstarkes Werkzeug für die Webentwicklung, das eine Vielzahl unterschiedlicher Programmierlogiken und Algorithmen unterstützen kann. Unter diesen ist die Implementierung der Fibonacci-Folge ein häufiges und klassisches Programmierproblem. In diesem Artikel stellen wir vor, wie Sie die Fibonacci-Folge mit der Programmiersprache PHP implementieren, und fügen spezifische Codebeispiele bei. Die Fibonacci-Folge ist eine mathematische Folge, die wie folgt definiert ist: Das erste und das zweite Element der Folge sind 1, und ab dem dritten Element ist der Wert jedes Elements gleich der Summe der beiden vorherigen Elemente. Die ersten paar Elemente der Sequenz

Im heutigen Bereich der Softwareentwicklung wird Golang (Go-Sprache) als effiziente, prägnante und hochgradig parallele Programmiersprache von Entwicklern zunehmend bevorzugt. Seine umfangreiche Standardbibliothek und die effizienten Parallelitätsfunktionen machen es zu einer hochkarätigen Wahl im Bereich der Spieleentwicklung. In diesem Artikel wird untersucht, wie man Golang für die Spieleentwicklung verwendet, und seine leistungsstarken Möglichkeiten anhand spezifischer Codebeispiele demonstriert. 1. Golangs Vorteile bei der Spieleentwicklung: Als statisch typisierte Sprache wird Golang beim Aufbau großer Spielsysteme verwendet.

Implementierungsleitfaden für PHP-Spielanforderungen Mit der Popularität und Entwicklung des Internets erfreut sich der Markt für Webspiele immer größerer Beliebtheit. Viele Entwickler hoffen, die PHP-Sprache zur Entwicklung ihrer eigenen Webspiele nutzen zu können, und die Umsetzung der Spielanforderungen ist ein wichtiger Schritt. In diesem Artikel wird erläutert, wie Sie mithilfe der PHP-Sprache allgemeine Spielanforderungen implementieren und spezifische Codebeispiele bereitstellen. 1. Spielfiguren erstellen In Webspielen sind Spielfiguren ein sehr wichtiges Element. Wir müssen die Attribute des Spielcharakters wie Name, Level, Erfahrungswert usw. definieren und Methoden für deren Bedienung bereitstellen

Die Implementierung exakter Divisionsoperationen in Golang ist ein häufiger Bedarf, insbesondere in Szenarien mit Finanzberechnungen oder anderen Szenarien, die hochpräzise Berechnungen erfordern. Der in Golang integrierte Divisionsoperator „/“ wird für Gleitkommazahlen berechnet, und manchmal besteht das Problem eines Präzisionsverlusts. Um dieses Problem zu lösen, können wir Bibliotheken von Drittanbietern oder benutzerdefinierte Funktionen verwenden, um exakte Divisionsoperationen zu implementieren. Ein gängiger Ansatz ist die Verwendung des Rat-Typs aus dem Paket math/big, der eine Darstellung von Brüchen bereitstellt und zur Implementierung exakter Divisionsoperationen verwendet werden kann.

Anlässlich der Veröffentlichung der Build 26040-Version von Windows Server gab Microsoft den offiziellen Namen des Produkts bekannt: Windows Server 2025. Außerdem wurde die Windows11WindowsInsiderCanaryChannel-Version build26040 eingeführt. Einige Freunde erinnern sich vielleicht noch daran, dass vor vielen Jahren jemand Windows NT erfolgreich vom Workstation-Modus in den Server-Modus umgestellt hat und dabei die Gemeinsamkeiten verschiedener Versionen von Microsoft-Betriebssystemen aufgezeigt hat. Zwar gibt es deutliche Unterschiede zwischen Microsofts aktueller Version des Server-Betriebssystems und Windows 11, doch wer auf die Details achtet, dürfte neugierig sein: Warum Windows Server die Marke aktualisiert hat,
