Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query su tabella SQL produce il LOCK!

300 views
Skip to first unread message

Marco Papo

unread,
Sep 17, 2008, 3:04:32 AM9/17/08
to
Buongiorno a tutti,

Ho il classico MDB collegato a SQL. Ho notato che se faccio una query access
di SELECT su una tabella SQL, finchè la query non termina la tabella è in
LOCK, vi torna questo comportamento.

Per evitare il problema potrei fare delle query Pass-Trough con l'opzione
WITH (NOLOCK) ma c'è un altro modo per evitare questo problema. Che so
specificando un'opzione nella query access?

Aggiungo che nelle Opzioni di Access ho impostato come "Blocco Record
Predefintio" l'opzione "Nessun Blocco".

Grazie.

--
Marco Papetti
www.shortchannel.it Il software di commercio elettronico OpenSource
www.mondoideale.com - Prodotti naturali e biologici.


giorgio rancati

unread,
Sep 17, 2008, 6:37:18 PM9/17/08
to

"Marco Papo" <marco....@gmail.com> ha scritto nel messaggio
news:gaqa60$ag4$1...@aioe.org...

> Buongiorno a tutti,
>
> Ho il classico MDB collegato a SQL. Ho notato che se faccio una query
> access di SELECT su una tabella SQL, finchè la query non termina la
> tabella è in LOCK, vi torna questo comportamento.

sì, certo.

> Per evitare il problema potrei fare delle query Pass-Trough con l'opzione
> WITH (NOLOCK)

credo sia l'unica via oltre quella di modificare il livello di isolamento
del database ma credo che quest'ultima opzione scateni le ire del tuo db
admin :-)

>ma c'è un altro modo per evitare questo problema. Che so specificando
>un'opzione nella query access?

lato Access il solo modo per evitare il Lock e i potenziali Dead Lock, è
quello di richiedere pochi records al server.

> Aggiungo che nelle Opzioni di Access ho impostato come "Blocco Record
> Predefintio" l'opzione "Nessun Blocco".

il manuale di Access dice:
----
I dati contenuti in una maschera, in un report o in una query di un database
ODBC (Open Database Connectivity) vengono trattati come se fosse stata
scelta l'impostazione Nessun record senza considerare l'impostazione della
proprietà RecordLocks.
----
quindi la proprietà "RecordLocks" non ha alcuna influenza.con tabella
allegate via ODBC.

Ciao
--
Giorgio Rancati
[Office Access MVP]


Marco Papo

unread,
Sep 18, 2008, 2:17:18 AM9/18/08
to
Ciao Giorgio,

grazie per la risposta.

>> Ho il classico MDB collegato a SQL. Ho notato che se faccio una query
>> access di SELECT su una tabella SQL, finchè la query non termina la
>> tabella è in LOCK, vi torna questo comportamento.
>
> sì, certo.
>
>> Per evitare il problema potrei fare delle query Pass-Trough con l'opzione
>> WITH (NOLOCK)
>
> credo sia l'unica via oltre quella di modificare il livello di isolamento
> del database ma credo che quest'ultima opzione scateni le ire del tuo db
> admin :-)
>
>>ma c'è un altro modo per evitare questo problema. Che so specificando
>>un'opzione nella query access?
>
> lato Access il solo modo per evitare il Lock e i potenziali Dead Lock, è
> quello di richiedere pochi records al server.

Bel problema quando la query serve per statistiche.... li i records da
interrogare sono tanti.
Non avendo tempo di riscrivere tutte le query come PassThrough, anche se
piano, piano lo farò, ho risolto creando una tabella di dati raggruppati per
le statistiche che riempio ogni giorno con una store procedure

>
>> Aggiungo che nelle Opzioni di Access ho impostato come "Blocco Record
>> Predefintio" l'opzione "Nessun Blocco".
>
> il manuale di Access dice:
> ----
> I dati contenuti in una maschera, in un report o in una query di un
> database ODBC (Open Database Connectivity) vengono trattati come se fosse
> stata scelta l'impostazione Nessun record senza considerare l'impostazione
> della proprietà RecordLocks.
> ----
> quindi la proprietà "RecordLocks" non ha alcuna influenza.con tabella
> allegate via ODBC.

Questo non lo sapevo!

Un'altra domanda , giusto per capire un po di più su come lavorano access e
sql insieme.
Avevo provato a creare delle query PAss-Through del tipo select * from
tabella with (nolock) e salvarle nel DB access, pensando che poi avrei
potuto fare delle query access su quelle Pass-Trough senza locKare la
tabella, ma le prestazioni precipitano, quando inserisco dei criteri nella
query access! Sono molto più lente delle stesse query fatte direttamnete
sulla tabella collegata.
Che dici?

> Ciao
Ciao e grazie mille.

giorgio rancati

unread,
Sep 18, 2008, 5:17:37 AM9/18/08
to

"Marco Papo" <marco....@gmail.com> ha scritto nel messaggio
news:gasrpf$pg4$1...@aioe.org...
>
>> lato Access il solo modo per evitare il Lock e i potenziali Dead Lock, č
>> quello di richiedere pochi records al server.

> Bel problema quando la query serve per statistiche.... li i records da
> interrogare sono tanti.

forse č meglio fare una precisazione, non ha importaza se il numero di
records da elaborare sono tanti, quello che mantiene il LOCK sulle pagine
della tabella o dell'indice č il numero di records da restituire al client.
Se ad esempio la query elabora 1 milione di records e ne restituisce solo
poche centinaia al client le pagine della tabella lato server non rimangono
bloccate.
Se invece il numero di righe da restituire al client sono molte, il driver
odbc comincia a richederne solo una prima parte, poi sospende la richiesta e
Sql Server mantiene bloccata la prima pagina del blocco di dati che verrň
inviato al client in un secondo momento.
Poi quando l'utente passa all'ultimo record della query viene richiesta la
parte di dati che era in sospeso eliminando il blocco sulle pagine.
Per capire/vedere questo meccanismo puoi eseguire da Sql Server managment
studio la stored procedure di sistema sp_lock.

> Un'altra domanda , giusto per capire un po di piů su come lavorano access

> e sql insieme.
> Avevo provato a creare delle query PAss-Through del tipo select * from
> tabella with (nolock) e salvarle nel DB access, pensando che poi avrei
> potuto fare delle query access su quelle Pass-Trough senza locKare la
> tabella, ma le prestazioni precipitano, quando inserisco dei criteri nella

> query access! Sono molto piů lente delle stesse query fatte direttamnete

> sulla tabella collegata.
> Che dici?

eh, dico che č normale che sia cosě:-)
La query Pass-through richiede tutte le righe al server, poi Access filtra
in locale i dati ricevuti in base ai criteri della seconda query.
La query fatta direttamente sulla tabella allegata, se possibile, viene
elaborata lato server quindi minor traffico di rete e prestazioni migliori.

>Ciao e grazie mille.
Prego :-)
Ciao

0 new messages