Newsgroup: it.comp.lang.delphi
Titolo: ADO e SQL Server

Salve a tutti,
ho un problema nella gestione delle transazioni tra le ADO standard di
Delphi e Sql Server. Ho impostato l'isolation level della connessione
ADO a readuncommitted, che secondo la documentazione del Delphi
dovrebbe permettermi di leggere dalla tabella anche le righe non
committate (dirty) da altre applicazioni.
Il programmino in Delphi effettua una semplice scrittura su una
tabella, ma finchè non effettuo il commit (o il rollback) della
transazione, qualsiasi altro applicativo che utilizzi SQL Server non
riesce ad accedere in lettura sulla tabella stessa, rimanendo bloccato
finchè l'operazione non viene completata. Abbiamo notato inoltre che
se la condizione della SELECT non interessa la riga (o le righe) su
cui si sta scrivendo, la visualizzazione avviene in maniera corretta.
Infine, facendo la stessa cosa in VB, utilizzando le ADO stardard
Microsoft (mdac 2.5), tutto procede normalmente.
Sto utilizzando il Delphi 6, sql server 2000.
Aiutatemi, non so dove sbattere la testa.
Grazie mille
Paolo

Microsoft (mdac 2.5), tutto procede normalmente.
Stai facendo un errore molto comune.
L'isolation level non ha una funzione di record-table locking ma, al
contrario, serve per decidere che cosa si vuole LEGGERE.
Un esempio.
Il programma A modifica N record
BEGIN TRANSACTION
UPDATE TABELLA SET VALORE = 100 WHERE CONDIZIONE
COMMIT TRANSACTION
Il programma B invece, lavora sulla stessa tabella in lettura e/o
scrittura. E' il programma B che devide che tipo di dati vuole
leggere: dirty read, committed, serializable etc. Quindi se me ne
voglio fregare di quello che fanno gli altri farò:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM TABELLA WHERE CONDIZIONE
che poi è lo stesso che fare senza specificare l'isolation level
SELECT * FROM TABELLA WITH (NOLOCK)
mentre, se voglio essere sicuro che ciò che leggo sia "up to date"
farò
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM TABELLA WHERE CONDIZIONE
Conscio del fatto che potrei avere dei ritardi in lettura.
Quindi, il problema non è del tuo programma nuovo, ma di quelli vecchi
che non utilizzano l'isolation level in modo corretto.
Ciao
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"


Piccola aggiunta (ma importante).
L'isolation level con dbGo (l'ADO di delphi) non funziona
correttamente. 
Comunque si setti viene utilizzato il default che è read committed.
La soluzione è di dichiararlo esplicitamente nella query
set transaction isolation level read uncommitted
select * from tabella


 select * from tabella
Ti ringrazio per la risposta, ma continuo ad avere dei dubbi.Non
capisco perche' facendo un interrogazione, anche con il query
analyzer, mentre l'appicativo delphi scrive sulla tabella, rimane
tutto bloccato finche' l'applicazione finisce l'operazione.
Questo non succede con lo stesso programma scritto in visual basic.
Ho provato anche a mettere nella postconnected del database l'sql da
te indicata
set transaction isolation level read uncommitted
begin transaction
ma il risultato non cambia.
Ho notato che se non uso le transazioni (begin transaction - commit)
il problema non si verifica, e' chiaro che questo compromette la
stabilità dei dati in caso di errore o interruzione del processo, e
quindi non e' una strada praticabile.
Attendo fiducioso risposta
Grazie

Grazie
