J'utilise une requête comme ceci:Est-ce que INSERT ... SELECT une transaction atomique?
INSERT INTO table
SELECT * FROM table2 t2
JOIN ...
...
WHERE table2.date < now() - '1 day'::INTERVAL
FOR UPDATE OF t2 SKIP LOCKED
ON CONFLICT (...)
DO UPDATE SET ...
RETURNING *;
Ma question porte sur FOR UPDATE t2 SKIP LOCKED
. Devrais-je l'utiliser ici? Ou Postgres verrouillera-t-il automatiquement ces lignes avec INSERT SELECT ON CONFLICT
jusqu'à la fin de la transaction?
Mon but est d'empêcher les autres applications de capturer (simultanément) des lignes avec le SELECT
qui sont déjà capturées par celui-ci.
Il n'y a aucune raison de verrouiller automatiquement les lignes d'une sous-requête dans 'INSERT ... ON CONFLICT' car la sous-commande est exécutée une seule fois. Vous devez verrouiller les lignes explicitement. – klin