Newsgroup: it.comp.lang.delphi
Titolo: TIBTransaction

Buongiorno a tutto il newsgroup.
Effettuando delle prove per la condivisione dei dati utilizzati da una mia
applicazione (BCB6, Interbase open source) in rete locale, mi scontro con un
problema piuttosto annoso...
Ho una tabella clienti a cui associo una transazione, il cui isolation-level
č stao impostato a readcommitted.
Fin qui tutto ok.
Il codice che eseguo č pressappoco questo:
try{
if(!Clienti->DBTransaction->Active){
    Clienti->DBTransaction->StartTransaction();
    Clienti->InsertRecord();
    Clienti->DBTransaction->Commit();
}
}
catch(...){
    Clienti->Transaction->Rollback();
}
Ora, anche se provo ad eseguire la transazione dati *non appena* connesso
agli archivi (quindi nessun altro client di rete puň avere iniziato una
transazione), mi viene generata la 'classica' eccezione EIBInterbaseError,
con messaggio "transaction is active".
Premesso che mi sto avvicinando ora allo sviluppo di rete, mi chiedo (e
altrettanto faccio con voi, sicuramente piů esperti di me) come sia
possibile che la transazione associata alla tabella considerata sia comunque
attiva, anche se nessun client ne ha invocato l'esecuzione.
Grazie a tutti.
A.

a design time imposta la proprietà active dell'oggetto a false.
AS

 a design time imposta la proprietà active dell'oggetto a false.
Intanto, Alberto, grazie.
La proprietà active della Transaction associata al ClientDataset Clienti è
già impostata a 'false' a designtime.
Vome richiesto dall'IDE, imposto la proprietà DefaultDatabase al componente
IBdatabase che utilizzo per accedere agli archivi.
Ho notato che tutte le IBTransaction diventano Active all'atto della
connessione al server.
Sto provando a spulciarmi l'help ma non ne ricavo nulla di buono.
Avete qualche consiglio da darmi?
Grazie e buon lavoro,
A.

 connessione al server.
su d5e non succede. Se a designtime le imposto a non attive, le lascia 
cosi' e poi devo attivarle io.
Che versione di delphi usi?
AS

 Che versione di delphi usi?
Uso C++Builder 6.
Credendo che si trattasse di un mio errore, ho provato a buttare giů tutto e
a ricominciare seguendo passo passo l'help.
Ho associato una transazione ad ogni Query (IBQuery o IBClientDataset)
presente nella mia app.
La transazione rimane inattiva fin quando non cerco di generare una nuova
chiave primaria per la tabella Clienti considerata.
Quello che non capisco č che, considerata questa operazione, la generazione
di un nuovo id (per ora svolta a livello locale, senza nessuna stored
procedure sul server) avviene eseguendo una query che possiede una *SUA*
transazione (che, quindi, non ha nulla a che fare con quella associata alla
tabella principale).
Mi appello, allora, alla vostra esperienza: esiste un motivo valido per cui,
attivando questo generatore di chiavi, dovrebbero attivarsi in contemporanea
le due transazioni relative a questa query e alla tabella principale?
Tenete anche presente che non uso alcun oggetto data-aware.
Grazie,
A.

 Tenete anche presente che non uso alcun oggetto data-aware.
Mi sono perso...
Tu hai un oggetto query che usi x calcolare un id con una sua 
tibtransaction.
Poi hai un "nonsoche" (tibtable? tibquery?...) con una sua tibtransaction.
Se attivi la transazione della query che usi x calcolare l'id si attiva 
anche quella del "nonsoche"?
Intanto, se non lo hai fatto, metti nel data module principale della tua 
app una tibtransaction generica che non associ ad alcun oggetto tibxxx 
tranne che al tibdatabase usando la prop defaulttransaction.
AS

 tranne che al tibdatabase usando la prop defaulttransaction.
Infatti, l'esperienza ha avuto la meglio... Ora va.
Ovviamente il database, non avendo transazioni (che poi, ancora non ho
capito perché non gliene avevo associate...), si 'agganciava' ad una di
quelle già presenti.
Ora, il problema è un altro: Inserisco i dati, effettuo il
Tranasction->Commit()(quindi salvo il dato sul disco) e, dopo questa
operazione, la transazione risulta sempre e comunque attiva (cosìcché
ulteriori tentativi di inserimento dati generano un'eccezione di tipo
'transaction is already active').
Sbaglio (probabile...) ancora qualcosa, vero?
Grazie,
A.

Devi chiamare la close!
--- posted by geoForum on 
http://www.delphiedintorni.it

 Devi chiamare la close!
Grazie mille ad entrambi.
Non lo avevo ancora fatto, in quanto credevo che la Commit() si preoccupasse
autonomamente di chiudere la transazione dopo aver effettuato la scrittura
su disco dei dati.
Ma allora tra commit e commitretaining che differenza c'è?
Cosa sta a significare la dicitura "commitretaining retains the transaction
context" se in ogni caso la transazione va chiusa manualmente?
Grazie, ragazzi, della vostra pazienza ed esperienza.
A.