MySQL mise à JOUR et SÉLECTIONNEZ en un seul passage
J'ai une table MySQL de tâches à effectuer, chaque rangée de paramètres pour une seule tâche.
Il y a beaucoup de travailleurs apps (éventuellement sur différentes machines), l'exécution de tâches dans une boucle.
Les applications d'accès à la base de données à l'aide de MySQL natif C Api.
Afin de posséder une tâche, une app qui fait quelque chose comme ça:
-
Générer un unique dans le monde entier id (pour simplifier, disons que c'est un nombre)
-
UPDATE tasks
SET guid = %d
WHERE guid = 0 LIMIT 1
-
SELECT params
FROM tasks
WHERE guid = %d
-
Si la dernière requête retourne une ligne, il est propre et avoir les paramètres pour exécuter
Est-il un moyen pour obtenir le même effet (c'est à dire "propre" d'une ligne et d'obtenir ses paramètres) en un seul appel au serveur?
Vous devez vous connecter pour publier un commentaire.
essayez comme ceci
code ci-dessus a fonctionné pour moi
Vous pouvez créer une procédure qui n':
Si vous êtes à la recherche pour une seule requête, alors il ne peut pas se produire. La fonction de mise à JOUR spécifiquement renvoie le nombre d'éléments qui ont été mis à jour. De même, la fonction de sélection n'est pas possible de modifier un tableau, seules les valeurs de retour.
À l'aide d'une procédure sera en effet de le transformer en une fonction unique et il peut être pratique si le verrouillage est une préoccupation pour vous. Si votre principale préoccupation est le trafic réseau (c'est à dire: en passant trop de requêtes) puis utilisez la procédure. Si vous préoccupation est de surcharge du serveur (ie: le DB est de travailler trop dur), puis une charge supplémentaire de procédure pourrait faire empirer les choses.
J'ai exactement le même problème. Nous avons fini par utiliser PostreSQL au lieu de cela, et
mise à JOUR ... de RETOUR
:Exemple:
UPDATE 'my_table' SET 'status' = 1 WHERE 'status' = 0 LIMIT 1 RETURNING *;
Ou, dans votre cas:
UPDATE 'tasks' SET 'guid' = %d WHERE 'guid' = 0 LIMIT 1 RETURNING 'params';
Désolé, je sais que ce n'est pas de répondre à la question avec MySQL, et il pourrait ne pas être facile de passer à PostgreSQL, mais c'est le meilleur moyen que nous avons trouvé pour le faire. Même 6 ans plus tard, MySQL n'est toujours pas en charge
UPDATE ... RETURNING
. Il peut être ajouté à un certain moment dans l'avenir, mais pour l'instant MariaDB seulement il a pour DELETE.Modifier: Il y a une tâche (priorité faible) à ajouter
mise à JOUR ... de RETOUR
support pour MariaDB.Je ne sais pas sur le seul appel de la partie, mais ce que vous décrivez est un verrou. Les verrous sont un élément essentiel de bases de données relationnelles.
Je ne connais pas les spécificités de verrouillage d'une ligne, de le lire, puis le mettre à jour dans le serveur MySQL, mais avec un peu de lecture de la mysql de verrouillage de la documentation vous pourriez faire toutes sortes de verrouillage à base de manipulations.
La postgres documenation de les verrous a un grand exemple de décrire exactement ce que vous voulez faire: verrouiller la table, lire le tableau, modifier la table.
Il retourne 1 ou 0, selon que les valeurs ont été effectivement changé.
Celui-ci sélectionne la variable à partir de la connexion.
À partir de: ici