0

Je fais l'insertion dans une table Oracle en utilisant batchUpdate. Cinq threads parallèles différents appellent la méthode batchUpdate à insérer dans une seule table. La table est de type table temporaire globale.MultiThreading dans Java provoquant le verrouillage de table

L'exécution du programme ne se termine pas, il est bloqué après l'établissement de la connexion à la base de données.

Est-ce que plusieurs threads fonctionnant sur une table temporaire globale unique verrouillent la table et bloquent l'exécution du programme?

je peux voir le tableau ci-dessous verrouillé à l'aide query-

select object_name, object_type from all_objects where object_id in (select object_id from v$locked_object); 
+2

Pourquoi cinq threads? Pourquoi ne pas avoir un thread faire les insertions et les cinq autres "pousser" des valeurs à lui? – fge

+0

est-ce qu'il bloque ou bloque? En supposant que le premier thread valide la transaction, le deuxième thread devrait être en mesure de faire son travail. Sinon, comment les pools de données fonctionneraient-ils autrement? –

+1

Les discussions ont-elles chacune une connexion/session, ou partagent-elles et concourent-elles pour le même? Si c'est vraiment un GTT alors les sessions ne devraient pas s'interférer les unes avec les autres, car elles ne voient que leurs propres données de toute façon. Peut-être qu'un thread maintient la connexion unique et que les quatre autres threads attendent cela, au niveau Java, pas dans la base de données? –

Répondre

2

Oui ils le feront.

Si 2 sessions différentes mettent à jour la même table en même temps, la deuxième session ne pourra pas accéder à la table tant que la première table n'aura pas été mise à jour (COMMIT exécutée). La première session déploie en fait un 'LOCK' sur cette table jusqu'à ce que la mise à jour soit terminée.

Vous ne pouvez pas vraiment mettre à jour exactement le même bloc de données par deux threads exactement au même moment pouvez-vous?

C'est une fonctionnalité ORACLE pour maintenir la cohérence des données.

+3

Deux sessions mettant à jour une table temporaire globale ne voient que leurs propres données, de sorte qu'il semble que plusieurs sessions accèdent à la même connexion/session? Si c'est vraiment un GTT. –

0

Veuillez envoyer la sortie de cette requête. Oracle prend en charge plusieurs types de verrous. Certains d'entre eux peuvent être partagés (par exemple ceux de TM). Le fait que vous voyiez quelque chose dans la vue v $ locked_object ne signifie pas que certaines sessions sont bloquées.

Il est très probable que la table soit verrouillée uniquement pour les instructions DDL (ALTER TABLE). Mais pas pour DML.