{"id":193033,"date":"2025-08-16T17:57:41","date_gmt":"2025-08-16T15:57:41","guid":{"rendered":"https:\/\/fivemx.com\/?p=193033"},"modified":"2026-08-09T12:56:02","modified_gmt":"2026-08-09T10:56:02","slug":"mysql-asynchron-zu-oxmysql","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/de\/mysql-async-to-oxmysql\/","title":{"rendered":"mysql-async-Ressourcen sicher zu oxmysql migrieren"},"content":{"rendered":"<p>Verschiebe eine Ressource von mysql-async zu oxmysql, indem du die Treiberkonfiguration \u00e4nderst und die Parameter, R\u00fcckgabewerte und Fehlerbehandlung jeder Abfrage \u00fcberpr\u00fcfst. Eine Treiber-Migration erfordert keine Neuschreibung deines Datenbankschemas und garantiert keine schnellere Spielleistung.<\/p>\n<h2 id=\"prepare-a-recoverable-test\">Bereite einen wiederherstellbaren Test vor<\/h2>\n<p>Sichere die Datenbank und die entsprechenden Ressourcen und arbeite dann an einer isolierten Kopie. Inventarisiere jede Ressource, die mysql-async verwendet, und pr\u00fcfe, ob dein Framework bereits oxmysql ben\u00f6tigt. Notiere die installierte Treiberversion. \u00dcberpr\u00fcfe die <a href=\"https:\/\/github.com\/overextended\/oxmysql\">oxmysql-Quelle und Installationsanweisungen<\/a> f\u00fcr diese Version, bevor du die Treiber wechselst.<\/p>\n<h2 id=\"load-the-connection-before-the-driver\">Lade die Verbindung vor dem Treiber<\/h2>\n<p class=\"translation-block\">Belasse in der aktiven <code>server.cfg<\/code> die vorhandene private Einstellung <code>mysql_connection_string<\/code> oberhalb von <code>ensure oxmysql<\/code>. Starte abh\u00e4ngige Ressourcen danach. Ver\u00f6ffentliche keine Verbindungsdaten in Support-Logs. Entferne den Start des alten Treibers erst, wenn alle davon abh\u00e4ngigen Ressourcen ber\u00fccksichtigt wurden.<\/p>\n<p>Lade in jeder Lua-Ressource, die das globale Objekt <code data-no-translation=\"\" translate=\"no\">MySQL<\/code> verwendet, die Bibliothek vor ihren Server-Skripten:<\/p>\n<pre data-no-translation=\"\" translate=\"no\"><code data-no-translation=\"\" translate=\"no\">server_scripts {\n    '@oxmysql\/lib\/MySQL.lua',\n    'server\/*.lua'\n}\ndependency 'oxmysql'<\/code><\/pre>\n<h2 id=\"choose-the-result-you-need\">W\u00e4hle das Ergebnis, das du ben\u00f6tigst<\/h2>\n<p>Verwende <code data-no-translation=\"\" translate=\"no\">MySQL.query.await<\/code> f\u00fcr eine Reihe von Zeilen, <code data-no-translation=\"\" translate=\"no\">MySQL.single.await<\/code> f\u00fcr eine Zeile, <code data-no-translation=\"\" translate=\"no\">MySQL.scalar.await<\/code> f\u00fcr einen Wert, <code data-no-translation=\"\" translate=\"no\">MySQL.insert.await<\/code> f\u00fcr eine Einf\u00fcge-ID und <code data-no-translation=\"\" translate=\"no\">MySQL.update.await<\/code> f\u00fcr betroffene Zeilen. \u00dcberpr\u00fcfe die dokumentierte R\u00fcckgabe f\u00fcr deine Abfrage; ein leeres Ergebnis unterscheidet sich von einem Fehler.<\/p>\n<p>Dieses serverseitige Beispiel testet eine parametrisierte Roundtrip-Verbindung, ohne eine Gameplay-Tabelle zu ber\u00fchren. F\u00fchre es von einer Ressource aus, nachdem oxmysql gestartet wurde:<\/p>\n<pre data-no-translation=\"\" translate=\"no\"><code data-no-translation=\"\" translate=\"no\">CreateThread(function()\n    local ok, value = pcall(function()\n        return MySQL.scalar.await('SELECT ?', { 'connection-ok' })\n    end)\n    if ok and value == 'connection-ok' then\n        print('Database parameter check passed.')\n    else\n        print('Database parameter check failed; inspect the server log privately.')\n    end\nend)<\/code><\/pre>\n<h2 id=\"review-every-converted-call\">\u00dcberpr\u00fcfe jeden konvertierten Aufruf<\/h2>\n<p>Ersetze interpolierte Benutzerwerte durch positionale <code data-no-translation=\"\" translate=\"no\">?<\/code> -Platzhalter und eine geordnete Parametertabelle. Tabellen- und Spaltenbezeichner erfordern eine feste Zulassungsliste; Wertplatzhalter k\u00f6nnen keine beliebigen SQL-Bezeichner ausw\u00e4hlen.<\/p>\n<p>Await \u00e4ndert den Kontrollfluss: Verwende das Ergebnis, nachdem der Await zur\u00fcckkehrt, behandle fehlende Zeilen und Ausnahmen und \u00fcberpr\u00fcfe, ob der Spieler noch verbunden ist, bevor du handelst. Ein erfolgreicher SQL-Schreibvorgang aktualisiert nicht automatisch den In-Memory-Spielerstatus eines Frameworks.<\/p>\n<h2 id=\"keep-transactions-on-one-connection\">Transaktionen auf einer Verbindung halten<\/h2>\n<p>Verwende die dokumentierte Transaktions-API des Treibers f\u00fcr gruppierte SQL-Arbeiten. Separate <code data-no-translation=\"\" translate=\"no\">START TRANSACTION<\/code>, Abfrage und <code data-no-translation=\"\" translate=\"no\">COMMIT<\/code> Aufrufe \u00fcber einen Verbindungspool garantieren nicht, dass alle Anweisungen dieselbe Verbindung verwenden.<\/p>\n<p>Eine erfolgreiche Transaktion bedeutet, dass ihre SQL-Anweisungen nicht fehlgeschlagen sind. Ein <code data-no-translation=\"\" translate=\"no\">UPDATE<\/code> , das keine Zeile ver\u00e4ndert, kann trotzdem g\u00fcltiges SQL sein. Zahlungs- und Inventarlogik m\u00fcssen die fachlichen Bedingungen ausdr\u00fccklich pr\u00fcfen; kopiere kein allgemeines Beispiel f\u00fcr Guthaben\u00fcbertragungen in eine Live-Spielwirtschaft.<\/p>\n<h2 id=\"verify-correctness-before-speed\">Korrektheit vor Geschwindigkeit \u00fcberpr\u00fcfen<\/h2>\n<ol>\n<li>Suche nach verbleibenden mysql-async-Importen, -Exporten und Callback-Mustern. \u00dcberpr\u00fcfe, ob jeder Aufrufer die erwartete Form erh\u00e4lt.<\/li>\n<li>Teste Login, Charaktererstellung, Speichern, Wiederverbindung, Inventar, Garagen und relevante Job-Aktionen mit bekannten Datens\u00e4tzen. Teste nicht verf\u00fcgbare Datenbanken und abgelehnte Eingaben.<\/li>\n<li>Vergleiche erwartete Zeilen\u00e4nderungen und persistierte Salden. Halte Schema-\/Index\u00e4nderungen von dieser Treiber-Migration getrennt.<\/li>\n<li>F\u00fcr die Leistung messe dieselbe Gameplay-Aktion und Arbeitslast vor und nach der \u00c4nderung. Untersuche langsame Abfragen mit ihren Ausf\u00fchrungspl\u00e4nen; f\u00fcge Indizes erst nach \u00dcberpr\u00fcfung des tats\u00e4chlichen Schemas und der Abfrage hinzu.<\/li>\n<\/ol>\n<h2 id=\"release-and-rollback\">Ver\u00f6ffentlichung und Rollback<\/h2>\n<p>Plane ein Wartungsfenster ein, stelle den passenden Treiber\/Ressourcen-Satz bereit und f\u00fchre dieselben Pr\u00fcfungen durch. Halte den alten Satz f\u00fcr ein Rollback privat. Stelle ein Datenbank-Backup nur wieder her, wenn es f\u00fcr ge\u00e4nderte Daten oder Schemata erforderlich ist, und ber\u00fccksichtige alle Schreibvorg\u00e4nge seit diesem Backup. Das Zur\u00fcckkonvertieren von Text in einen kleineren Zeichensatz ist kein sicheres generisches Rollback.<\/p>\n<h2 id=\"reference-documentation\">Referenzdokumentation<\/h2>\n<p><a href=\"https:\/\/github.com\/overextended\/oxmysql\/blob\/main\/lib\/MySQL.lua\">Quelle: overextended\/oxmysql<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Verschiebe eine Ressource von mysql-async zu oxmysql, indem du die Treiberkonfiguration \u00e4nderst und die Parameter, R\u00fcckgabewerte und Fehlerbehandlung jeder Abfrage \u00fcberpr\u00fcfst. Eine Treiber-Migration erfordert keine Neuschreibung deines Datenbankschemas und garantiert keine schnellere Spielleistung.<\/p>","protected":false},"author":1,"featured_media":193034,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2881],"tags":[2950,2944],"class_list":["post-193033","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-performance","tag-framework","tag-ox"],"_links":{"self":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/193033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/comments?post=193033"}],"version-history":[{"count":0,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/193033\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media\/193034"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media?parent=193033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/categories?post=193033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/tags?post=193033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}