Je dispose d'un scénario de base de données (j'utilise Oracle) dans lequel plusieurs processus insèrent des données dans une table et un seul processus effectue une sélection. La table est essentiellement utilisée comme un espace de stockage intermédiaire, auquel plusieurs processus (appelés les rédacteurs ci-dessous) écrivent des événements de journal, et à partir duquel un seul processus (appelé le lecteur ci-dessous) lit les événements pour un traitement ultérieur. Le lecteur doit lire tous les événements insérés dans la table.
Actuellement, cela se fait en attribuant à chaque enregistrement inséré un identifiant d'une séquence ascendante. Le lecteur sélectionne périodiquement un bloc d'entrées de la table où l'identifiant est supérieur à l'identifiant le plus élevé du bloc précédemment lu. Par exemple :
SELECT
*
FROM
TRANSACTION_LOG
WHERE
id > (
SELECT
last_id
FROM
READER_STATUS
);
Le problème avec cette approche est que, comme les rédacteurs opèrent simultanément, les lignes ne sont pas toujours insérées dans l'ordre selon leur identifiant attribué, même si ces identifiants sont attribués dans l'ordre séquentiel ascendant. En d'autres termes, une ligne avec l'identifiant 100 est parfois écrite après un enregistrement avec l'identifiant 110, car le processus d'écriture de la ligne avec l'identifiant 110 a commencé après les processus écrivant l'enregistrement d'identifiant 100, mais a été validé en premier. Cela peut entraîner le fait que le lecteur manque la ligne avec l'identifiant 100 s'il a déjà lu la ligne avec l'identifiant 110.
Forcer les rédacteurs à verrouiller exclusivement la table résoudrait le problème car cela les obligerait à insérer séquentiellement et également à attendre pour tout engagement en attente pour le lecteur. Cependant, cela ne serait probablement pas très rapide.
Je pense que cela suffirait pour le lecteur d'attendre pour tout engagement en attente des processus rédacteurs. Autrement dit, les rédacteurs peuvent continuer à fonctionner simultanément tant que le lecteur ne lit pas tant que tous les rédacteurs n'ont pas terminé.
Ma question est la suivante :
Comment puis-je indiquer à mon processus lecteur d'attendre pour tout engagement en attente de mes processus rédacteurs ? Toutes suggestions alternatives à ce problème sont également les bienvenues.