J'ai besoin de maintenir une table statistique pour un projet, composé d'une liste d'articles et de leur utilisation (pensez à quelque chose comme un site Web dans lequel vous souhaitez compter les vues). Chaque fois qu'un article est instancié, j'ai besoin d'augmenter l'utilisation de l'élément spécifique.
Ma première mise en œuvre est la suivante:
statistics(
id integer NOT NULL,
name character varying(255) NOT NULL,
usage integer NOT NULL DEFAULT 0,
);
UPDATE statistics
SET usage = usage + 1
WHERE name = '<name>';
Mes préoccupations concernent la performance et la concurrence. Le processus de mise à jour sera instancié par plusieurs dispositifs dizaines (peut-être 80-120) et pourrait se produire plusieurs fois par seconde, de sorte que mes questions sont les suivantes:
1) Cette méthode conservea-t-elle la concurrence? (c.-à-d. Si plusieurs périphériques demandent la mise à jour "en même temps", veut TOUS Demande comptée?)
2) Pouvez-vous suggérer un meilleur moyen d'atteindre le résultat? Je m'attends à avoir une charge dans la rédaction des mises à jour, tandis que les lectures seraient beaucoup plus fréquentes. Existe-t-il une fonction spécifique pour augmenter les valeurs? Je regarde "séquence" mais je ne suis pas sûr que c'est la bonne façon ...
Merci beaucoup d'avance pour tout conseil
La deuxième mise à jour attendrait que la mise à jour précédente sur les mêmes lignes soit comitée, mais verra ensuite la valeur engagée.
Supposons deux transactions simultanées à mettre à jour la même ligne avec une valeur initiale de 0
[.____ ---------------------------------- 1 mise à jour ... 1 0 [.____] 2 1 Mise à jour .. "Undefined" [.____] (attend) 3 commit 1 2 [.____] 4 1 commit 2 [.____]
"Valeur T1" et "valeur T2" désigne la valeur que cette transaction voit.
Si vous souhaitez vous assurer de prendre des situations dans lesquelles il existe des changements "incompatibles" (par exemple, une transaction réglage de la colonne usage
à une valeur spécifique, plutôt que de simplement l'incrémenter), vous pouvez mettre toutes les transactions dans "Serializable". Niveau d'isolement. Mais vous devrez vous préparer à la manipulation des erreurs.
Les mises à jour de différents noms peuvent fonctionner simultanément sans aucune attente (car différentes lignes sont affectées).
SELECT
s ne sera jamais bloqué mais ne verra que des valeurs contractées.