Accesso contemporaneo ad una tabella

mercoledì 12 settembre 2007 - 17.10

dream Profilo | Newbie

DBMS: sql server 2005 express
Linguaggio: Visual basic 2005

Vorrei sapere se sql 2005 mette a disposizione degli strumenti per gestire l'accesso concorrente ad una stessa tabella.

Cerco di spiegarmi meglio.
In una macchina gira una funzione che ogni 25 sec accede in sola lettura ad una tabella.
in un' altra macchina gira una funzione che potrebbe modificare la stessa tabella (solo aggiungere righe).

Vorrei fare in modo che se una funzione legge l'altra non scrive e viceversa.

Una macchina accede mediante ADODB mentre l'altra medainte SQL Client ( la seconda è un diso WIN ce che non supporta ADO).

Sono accettati anche suggerimenti per risolvere da codice.

Grazie

lbenaglia Profilo | Guru

>In una macchina gira una funzione che ogni 25 sec accede in sola
>lettura ad una tabella.
>in un' altra macchina gira una funzione che potrebbe modificare
>la stessa tabella (solo aggiungere righe).
>
>Vorrei fare in modo che se una funzione legge l'altra non scrive
>e viceversa.

Il problema semplicemente non sussiste in quanto da sempre SQL Server utilizza un sistema di locking che potremmo definire "pessimistico".
Ogni operazione di scrittura necessita di un lock esclusivo a livello di riga, pertanto se due connessioni tentano di modificare la stessa riga, quella che arriva seconda dovrà attendere che la prima termini la transazione. Eventuali transazioni in lettura verranno anch'esse messe in attesa (blocking).
In realtà il sistema di locking è estremamente più ricco e complesso e se vuoi capirci di più ti suggerisco di iniziare da questo capitolo dei Books Online:

"Locking in the Database Engine"
http://msdn2.microsoft.com/en-us/library/ms190615.aspx

SQL Server 2005 introduce un nuovo sistema di locking "ottimistico" tipico di altri RDBMS (primo tra tutti Oracle Database), basato sulla versione delle righe.
Se una transazione sta aggiornando una certa riga e una seconda tenta di leggerla, quest'ultima non verrà bloccata in attesa che la prima termini l'operazione, ma verrà restituito il valore precedente delle colonne che sarà stato automaticamente memorizzato nel tempdb.
Per maggiori info:

"Understanding Row Versioning-Based Isolation Levels"
http://msdn2.microsoft.com/en-us/library/ms189050.aspx

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

dream Profilo | Newbie

Forse mi sono spiegato male.

Il mio peoblema non è la modifica di una tupla dopo che è stata letta (mi sembra si chiami WAR cioè write after read).

Il mio problema è che voglio limitare l'accesso all'intera tabella ad una singola procedura.

Provo a spiegarmi meglio.

Ho una procedura A che ogni volta legge per intero la tabella. Ho una procedura B che ogni tanto aggiunge delle nuove righe alla tabella.

Voglio fare in modo che mentre è in esecuzione la scrittura da parte di B non avvenga la lettura da parte di A e viceversa. B non modifica nessuna tupla. Le aggiunge e basta.

Le due procedure sono in due macchine diverse. Volevo sapere se sql 2005 prevedeva questa possibilità.

Grazie

lbenaglia Profilo | Guru

>Ho una procedura A che ogni volta legge per intero la tabella.
>Ho una procedura B che ogni tanto aggiunge delle nuove righe
>alla tabella.
>
>Voglio fare in modo che mentre è in esecuzione la scrittura da
>parte di B non avvenga la lettura da parte di A e viceversa.
>B non modifica nessuna tupla. Le aggiunge e basta.

Che richiesta originale...

>Le due procedure sono in due macchine diverse. Volevo sapere
>se sql 2005 prevedeva questa possibilità.
Dai un'occhiata al Transaction Isolation Level Serializable:

"SET TRANSACTION ISOLATION LEVEL (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms173763.aspx

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5