Bonjour à tous,
Je travaille sur une application redondée, avec 2 serveurs. Sur chacun des serveurs se trouve un base de données, et le but est de répliquer la base du serveur actif (qui se rempli régulièrement), sur le serveur passif.
Pour cela, les bases contiennent deux tables, qu'on appelera A et B. En fait, B contient exactement les mêmes champs que A, avec en plus un champ "A répliquer". Il y a un trigger sur A, qui fait en sorte que dès qu'il y a une entrée, on la copie dans B, avec le champ "A répliquer" à 1.
Le serveur passif a pour but de régulièrement lire la table B du serveur actif, et de recopier dans sa table A toutes les entrées de la table B qui ont le champ "A répliquer" à 1. Pour cela, une transaction est utilisée ainsi (sur le serveur passif) :
Debut Transaction
On recupère les lignes de la table B du serveur actif avec le champ "A répliquer" à 1
On les écris localement sur la table A
On met le champ "A répliquer" à 0 des lignes répliquées de la table B du serveur actif
Fin Transaction
Cela fonctionne la plupart du temps, mais de temps en temps, je tombe sur un deadlock :
Donc ma question est la suivante : d'où pourrait venir ce deadlock, étant donné que durant la transaction, seul le trigger du serveur actif va agir sur la table B. Le déclenchement du trigger pendant la transaction du serveur passif peut déclencher ce deadlock ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 *** IBPP::Exception inside Statement::Execute *** IBPP Message : isc_dsql_execute2 failed. SQL Message : -913 deadlock . Engine Code : 335544336 Engine Message : deadlock update conflicts with concurrent update
J'espère avoir été assez clair, et merci pour votre aide.
Partager