{"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-asynchrone-vers-oxmysql","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/fr\/mysql-async-to-oxmysql\/","title":{"rendered":"Migrer les ressources mysql-async vers oxmysql en toute s\u00e9curit\u00e9"},"content":{"rendered":"<p>D\u00e9placez une ressource de mysql-async vers oxmysql en modifiant sa configuration de pilote et en examinant les param\u00e8tres, la valeur de retour et la gestion des erreurs de chaque requ\u00eate. Une migration de pilote ne n\u00e9cessite pas de r\u00e9\u00e9crire votre sch\u00e9ma de base de donn\u00e9es et ne garantit pas un gameplay plus rapide.<\/p>\n<h2 id=\"prepare-a-recoverable-test\">Pr\u00e9parer un test r\u00e9cup\u00e9rable<\/h2>\n<p>Sauvegardez la base de donn\u00e9es et les ressources correspondantes, puis travaillez sur une copie isol\u00e9e. Inventoriez chaque ressource utilisant mysql-async et v\u00e9rifiez si votre framework n\u00e9cessite d\u00e9j\u00e0 oxmysql. Enregistrez la version du pilote install\u00e9. Examinez la <a href=\"https:\/\/github.com\/overextended\/oxmysql\">source oxmysql et les instructions d'installation<\/a> pour cette version avant de changer de pilote.<\/p>\n<h2 id=\"load-the-connection-before-the-driver\">Chargez la connexion avant le pilote<\/h2>\n<p class=\"translation-block\">Dans le fichier <code>server.cfg<\/code> actif, conservez le r\u00e9glage priv\u00e9 existant <code>mysql_connection_string<\/code> au-dessus de <code>ensure oxmysql<\/code>. D\u00e9marrez ensuite les ressources qui en d\u00e9pendent. Ne publiez pas les identifiants de connexion dans les journaux transmis au support. Ne supprimez le d\u00e9marrage de l\u2019ancien pilote qu\u2019apr\u00e8s avoir pris en compte toutes les ressources qui en d\u00e9pendent.<\/p>\n<p class=\"translation-block\">Dans chaque ressource Lua utilisant la variable globale <code>MySQL<\/code>, chargez la biblioth\u00e8que avant ses scripts serveur :<\/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\">Choisissez le r\u00e9sultat dont vous avez besoin<\/h2>\n<p>Utilisez <code data-no-translation=\"\" translate=\"no\">MySQL.query.await<\/code> pour un ensemble de lignes, <code data-no-translation=\"\" translate=\"no\">MySQL.single.await<\/code> pour une ligne, <code data-no-translation=\"\" translate=\"no\">MySQL.scalar.await<\/code> pour une valeur, <code data-no-translation=\"\" translate=\"no\">MySQL.insert.await<\/code> pour un ID d'insertion et <code data-no-translation=\"\" translate=\"no\">MySQL.update.await<\/code> pour les lignes affect\u00e9es. V\u00e9rifiez le retour document\u00e9 pour votre requ\u00eate\u00a0; un r\u00e9sultat vide est diff\u00e9rent d'une erreur.<\/p>\n<p>Cet exemple c\u00f4t\u00e9 serveur teste un aller-retour param\u00e9tr\u00e9 sans toucher \u00e0 une table de jeu. Ex\u00e9cutez-le \u00e0 partir d'une ressource apr\u00e8s le d\u00e9marrage d'oxmysql\u00a0:<\/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\">V\u00e9rifiez chaque appel converti<\/h2>\n<p class=\"translation-block\">Remplacez les valeurs utilisateur interpol\u00e9es par des param\u00e8tres positionnels <code>?<\/code> et une table de param\u00e8tres ordonn\u00e9e. Les noms de tables et de colonnes n\u00e9cessitent une liste d\u2019autorisation fixe ; les param\u00e8tres de valeurs ne permettent pas de choisir des identifiants SQL arbitraires.<\/p>\n<p>Await modifie le flux de contr\u00f4le\u00a0: utilisez le r\u00e9sultat apr\u00e8s le retour de await, g\u00e9rez les lignes manquantes et les exceptions, et v\u00e9rifiez si le joueur est toujours connect\u00e9 avant d'agir. Une \u00e9criture SQL r\u00e9ussie ne met pas automatiquement \u00e0 jour l'\u00e9tat du joueur en m\u00e9moire d'un framework.<\/p>\n<h2 id=\"keep-transactions-on-one-connection\">Maintenez les transactions sur une seule connexion<\/h2>\n<p class=\"translation-block\">Utilisez l\u2019API de transaction document\u00e9e du pilote pour regrouper les op\u00e9rations SQL. Des appels s\u00e9par\u00e9s \u00e0 <code>START TRANSACTION<\/code>, \u00e0 une requ\u00eate et \u00e0 <code>COMMIT<\/code> via un pool de connexions ne garantissent pas que toutes les instructions utilisent la m\u00eame connexion.<\/p>\n<p class=\"translation-block\">La r\u00e9ussite d\u2019une transaction signifie que ses instructions SQL n\u2019ont pas \u00e9chou\u00e9. Une instruction <code>UPDATE<\/code> qui ne modifie aucune ligne peut malgr\u00e9 tout \u00eatre du SQL valide. La logique des paiements et de l\u2019inventaire doit appliquer explicitement les r\u00e8gles m\u00e9tier ; ne copiez pas un exemple g\u00e9n\u00e9rique de transfert de solde dans une \u00e9conomie en production.<\/p>\n<h2 id=\"verify-correctness-before-speed\">V\u00e9rifiez l'exactitude avant la vitesse<\/h2>\n<ol>\n<li>Recherchez les importations, exportations et mod\u00e8les de rappel mysql-async restants. V\u00e9rifiez que chaque appelant re\u00e7oit la forme qu'il attend.<\/li>\n<li>Testez la connexion, la cr\u00e9ation de personnage, la sauvegarde, la reconnexion, l'inventaire, les garages et les actions de m\u00e9tier pertinentes \u00e0 l'aide d'enregistrements connus. Testez la base de donn\u00e9es indisponible et les entr\u00e9es rejet\u00e9es.<\/li>\n<li>Comparez les modifications de lignes attendues et les soldes persistants. S\u00e9parez les modifications de sch\u00e9ma\/index de cette migration de pilote.<\/li>\n<li>Pour les performances, mesurez la m\u00eame action de jeu et la m\u00eame charge de travail avant et apr\u00e8s. Examinez les requ\u00eates lentes avec leurs plans d'ex\u00e9cution\u00a0; ajoutez des index seulement apr\u00e8s avoir inspect\u00e9 le sch\u00e9ma et la requ\u00eate r\u00e9els.<\/li>\n<\/ol>\n<h2 id=\"release-and-rollback\">Publication et restauration<\/h2>\n<p>Planifiez une fen\u00eatre de maintenance, d\u00e9ployez l'ensemble pilote\/ressource correspondant et ex\u00e9cutez les m\u00eames v\u00e9rifications. Gardez l'ancien ensemble priv\u00e9 pour la restauration. Restaurez une sauvegarde de base de donn\u00e9es uniquement si n\u00e9cessaire pour les donn\u00e9es ou le sch\u00e9ma modifi\u00e9s, et tenez compte de toutes les \u00e9critures depuis cette sauvegarde. La conversion de texte vers un jeu de caract\u00e8res plus petit n'est pas une restauration g\u00e9n\u00e9rique s\u00fbre.<\/p>\n<h2 id=\"reference-documentation\">Documentation de r\u00e9f\u00e9rence<\/h2>\n<p><a href=\"https:\/\/github.com\/overextended\/oxmysql\/blob\/main\/lib\/MySQL.lua\">Source: overextended\/oxmysql<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>D\u00e9placez une ressource de mysql-async vers oxmysql en modifiant sa configuration de pilote et en examinant les param\u00e8tres, la valeur de retour et la gestion des erreurs de chaque requ\u00eate. Une migration de pilote ne n\u00e9cessite pas de r\u00e9\u00e9crire votre sch\u00e9ma de base de donn\u00e9es et ne garantit pas un gameplay plus rapide.<\/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\/fr\/wp-json\/wp\/v2\/posts\/193033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/comments?post=193033"}],"version-history":[{"count":0,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/posts\/193033\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/media\/193034"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/media?parent=193033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/categories?post=193033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/tags?post=193033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}