5 messaggi dal 12 gennaio 2012
ciao a tutti, primo post :)

vi ringrazio anticipatamente per l'aiuto e vi spiego il mio problema:

DB:SqlServer 2005 stdEdition
voglio far in modo che 2 o più utenti possano aprire transazioni contemporanee sulla stessa tabella secondo queste modalità:
in lettura : sempre;
in modifica: lock su record;
inserimento: sempre;
cancellazione : (se il record non è lockato in modifica)

ora ho provato a impostare questi 2 paramestri
?SET ALLOW_SNAPSHOT_ISOLATION ON
?SET READ_COMMITTED_SNAPSHOT ON

In questo modo riusciamo ad accedere alle stesse tabelle in lettura, modifica e inserimento ma non in cancellazione (anche di righe che non sono interessate alla precedente transazione).

sapete aiutarmi?

Grazie
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao, benvenuto nel forum :)
Il livello di isolamento che usi è READ COMMITTED, giusto?

giggio240181 ha scritto:

non in cancellazione (anche di righe che non sono interessate alla precedente transazione).

Strano, perché la prima transazione acquisisce un lock sulle sole righe che sta scrivendo, quindi una seconda transazione concorrente alla prima non dovrebbe avere alcun problema a scrivere su ALTRE righe su cui non è stato posto il lock.

In che modo hai verificato questo comportamento? Posta il codice che hai usato.

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
5 messaggi dal 12 gennaio 2012
ciao e grazie per la risposta :)
allora ho fatto un test di questo tipo (per semplificare qualcosa che poi è un pochino più complessa) che secondo me è significativo:
ho una tabella "tmp" che ha due campi "C1" e "C2" dove "C1" è PK

aprendo 2 transazioni quello che succede è che se cancello per PK funziona tutto altrimenti no... in particolare rimane appesa la riga R5

Grazieeeeeeee

-- prima transaction
R1 begin transaction
R2 update tmp set c2='ciao' where c1=1
R7 commit



-- seconda transaction (contemporanea alla prima)
R3 begin transaction

R4 delete tmp where c1=3
R5 delete tmp where c2='fdsf'

R6 commit
5.610 messaggi dal 09 febbraio 2002
Contributi
Ciao!
ok, ora con l'esempio ho capito a cosa ti riferivi parlando delle righe non interessate dall'altra transazione.

Il problema di R5 è che Sql Server non può sapere, a priori, quali siano le righe il cui campo 'c2' vale 'fdsf'. Deve necessariamente fare un table-scan, ovvero esaminare una per una tutte le righe della tabella per scoprire quali di esse corrispondono alla tua ricerca.
Quando arriva ad esaminare la riga con c1=1, su cui la prima transazione ha posto un lock, si mette in attesa del commit prima di procedere con l'eliminazione.

R4 invece non è affetta da questo problema perché come criterio di ricerca lì utilizzi la chiave primaria che è un indice ordinato che identifica chiaramente la posizione di ciascuna riga. E' come quando cerchi una pagina specifica all'interno di un libro: non devi aprirlo e leggere l'intera pagina ma ti basta sfogliare l'angolino in basso a destra finché non la trovi.

Quindi la soluzione potrebbe essere quella di aggiungere un indice anche su c2. In questo modo SQL Server non incapperà più nella riga lockata ed R5 non dovrà più attendere il commit della prima transazione.

Comunque... immagino che la situazione reale sia più complicata di così e, se coinvolge più colonne, aggiungere degli indici potrebbe non essere il consiglio più corretto.

Valuta bene se è effettivamente necessario che la seconda transazione si possa risolvere contemporaneamente alla prima. Oltre che le prestazioni, tieni soprattutto in considerazione il livello di isolamento che hai scelto e i pregi e difetti che porta con sé. Ad esempio il READ COMMITTED non ti protegge da artefatti come Nonrepeatable reads e Phantom reads ma solo tu puoi valutare se questi potranno avere un qualche effetto su ciò che la tua applicazione produce.
http://msdn.microsoft.com/it-it/library/ms378149%28v=sql.90%29.aspx

ciao
Modificato da BrightSoul il 17 gennaio 2012 22.33 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
5 messaggi dal 12 gennaio 2012
Grazie mille, ho risolto :)
in effetti e' proprio così e la cosa era aggravata dal fatto che c'erano forenKey autoreferenziate ...

adesso verifico bene le performance, graziassssssssssss

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC