Comment faire un SELECT FOR UPDATE” avec une condition sur plusieurs tableaux sur une base de données DB2?
Problème
Sur une base de données DB2 (version 9.5) l'instruction SQL
SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR
me donne le message d'erreur SQLSTATE=42829
(La clause FOR UPDATE n'est pas autorisée, car la table spécifiés par le curseur ne peut pas être modifié).
Informations supplémentaires
J'ai besoin de spécifier WITH RR
, parce que je suis en cours d'exécution sur le niveau d'isolation READ_COMMITTED
, mais j'ai besoin de ma requête à bloc alors qu'il y est un autre processus qui exécute la même requête.
Solution pour l'instant...
Si je à la place de la requête comme ceci:
SELECT t.Id FROM Table t WHERE t.Id IN (
SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RR
tout fonctionne bien.
Nouveau problème
Mais maintenant, je reçois parfois impasse des exceptions lorsque plusieurs processus exécuter cette requête simultanément.
Question
Est-il un moyen de formuler les FOR UPDATE
de la requête, sans l'introduction d'un endroit où un blocage peut se produire?
OriginalL'auteur tangens | 2010-10-07
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, pour avoir le niveau d'isolation
READ_COMMITTED
vous n'avez pas besoin de spécifierWITH RR
, parce que cela se traduit dans le niveau d'isolationSERIALIZABLE
. Pour spécifierWITH RS
(Lire la Stabilité est suffisante.Pour propager la
FOR UPDATE WITH RS
à l'intérieur de la sélection que vous ayez à préciser de plusUSE AND KEEP UPDATE LOCKS
.Donc l'énoncé complet ressemble à ceci:
J'ai fait quelques tests sur une base de données DB2 via JDBC et il a travaillé sans blocages.
OriginalL'auteur zuserus