Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/02/2006, 16h43   #1
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Par défaut [10g1][OCI][C++][IIS] Blocage sur un update

Bonjour à tous,

j'ai un bout de code faisant appel à OCI et qui fonctionne bien lorsqu'on lui passe un "select", mais qui bloque quand on lui passe un update. Dans ce dernier cas, la fonction OCIStmtExecute coince, donc l'appli aussi.
Extrait du code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
// SELECT query... 
CString sz = "select count(*) from road.test"; 
st = ::OCIStmtPrepare(  m_pStmt, m_pErr, 
                       (text*) sz.GetBuffer( 0 ), sz.GetLength(), 
                        OCI_NTV_SYNTAX, OCI_DEFAULT ); 
IF ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) { 
  RETURN false; 
} 
 
// ---> this one is ok 
st = ::OCIStmtExecute( m_pService, m_pStmt, m_pErr, 0, 0, NULL, NULL, OCI_DEFAULT ); 
IF ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) { 
  RETURN false; 
} 
 
// UPDATE query 
sz = "update road.test set col1 = 3"; 
st = ::OCIStmtPrepare(  m_pStmt, m_pErr, 
                       (text*) sz.GetBuffer( 0 ), sz.GetLength(), 
                        OCI_NTV_SYNTAX, OCI_DEFAULT ); 
IF ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) { 
  RETURN false; 
} 
 
// ---> this one never returns.... 
st = ::OCIStmtExecute( m_pService, m_pStmt, m_pErr, 1, 0, NULL, NULL, OCI_DEFAULT ); 
IF ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) { 
  RETURN false; 
}
En fait, je me demande s'il n'y a pas un problème de configuration. Si je me connecte avec les mêmes user/pwd en passant par la console d'administration, le update fonctionne. Si j'envoie ce même update via un autre code exploitant OCI (la petite appli Osql freeware de Ben Bryant), il bloque au même endroit que moi.

Qu'ai-je pu oublier au niveau droits (ou paramétrage de l'environnement lors de l'OCIEnvCreate, ou ailleurs) qui me bloque ainsi ??????
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 20h38   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Ce n'est probablement pas un problème de droit sinon Oracle retournerait un message d'erreur immédiatement. Cela ressemble plus à un problème de verrouillage qui peut être lié eventuellement au mode d'isolation de la transaction (SET TRANSACTION ...) ou d'une autre session qui verrouillerait la ligne concernée.

Essaie de vérifier que la ligne en question n'est pas verrouillé en remplaçant la commande "update road.test set col1=3 par "select col1 from road.test where col1=x for update nowait"
Sil la ligne est verrouillée: ORA-00054 sera retourné.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2006, 09h32   #3
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Tu as raison : c'est une session ouverte lors d'un test précédent et mal fermée (en fait pas fermée du tout... ) qui bloquait les lignes.
Ouf !
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h02.


 
 
 
 
Partenaires

Hébergement Web