Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Accesso contemporaneo ad una tabella
mercoledì 12 settembre 2007 - 17.10
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
dream
Profilo
| Newbie
36
messaggi | Data Invio:
mer 12 set 2007 - 17:10
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
5.625
messaggi | Data Invio:
mer 12 set 2007 - 19:52
>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
36
messaggi | Data Invio:
gio 13 set 2007 - 09:41
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
5.625
messaggi | Data Invio:
gio 13 set 2007 - 19:23
>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
Torna su
Stanze Forum
Elenco Threads
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 !