AngeloNero
12-02-2007, 13:00
Ciao Ragazzi,
è un'intera nottata e mezza giornata di oggi :coffee: che mi sbatto per un problema che non riesco a risolvere.
Devo gestire la concorrenza in un client di accesso al DB.
Il client è un foglio excel dal quale diversi utenti devono poter interrogare un DB e scriverci sopra.
La tabella è unica e vorrei che quando un utente accede in scrittura, agli altri utenti non sia permesso di accedere tranne che in lettura.
Ho pensato di fare delle procedure in vba che effettuano le connessioni (una in lettura ed una in scrittura) e di gestire la concorrenza con le transazioni e le select for update.
Il problema è che quando il primo utente fa la select for update per il lock della tabella, il client del secondo utente che sta cercando di scrivere sulla tabella va in freeze (deadlock) sino a quando il primo utente non ha committato e non appena avviene il commit effettua le sue update. Insomma il comportamento classico.
A me piacerebbe invece che il client testasse se la transazione è in fase di scrittura da parte di un'utente e restituisse un messaggio negli eventuali altri tentativi di scrittura, impedendoli.
MA COME FARE??? Se avete link o volete scrivermi qualche pezzettino di codice...non so... mi sento frustato :cry:.
L'alternativa, poco elegante, sarebbe quella di gestire una tabella di storico sulle operazioni, dove viene riportata l'utenza e l'operazione, e dalla quale leggere lo stato della tabella prima di accedervi in scrittura eventualmente. Se la tabella riporta un'utenza in fase di scrittura allora a nessun'altra utenza sarà possibile scrivere. Ma come ho detto non mi piace come idea.
Grazie mille, confido in voi. :help: :help: :ave:
è un'intera nottata e mezza giornata di oggi :coffee: che mi sbatto per un problema che non riesco a risolvere.
Devo gestire la concorrenza in un client di accesso al DB.
Il client è un foglio excel dal quale diversi utenti devono poter interrogare un DB e scriverci sopra.
La tabella è unica e vorrei che quando un utente accede in scrittura, agli altri utenti non sia permesso di accedere tranne che in lettura.
Ho pensato di fare delle procedure in vba che effettuano le connessioni (una in lettura ed una in scrittura) e di gestire la concorrenza con le transazioni e le select for update.
Il problema è che quando il primo utente fa la select for update per il lock della tabella, il client del secondo utente che sta cercando di scrivere sulla tabella va in freeze (deadlock) sino a quando il primo utente non ha committato e non appena avviene il commit effettua le sue update. Insomma il comportamento classico.
A me piacerebbe invece che il client testasse se la transazione è in fase di scrittura da parte di un'utente e restituisse un messaggio negli eventuali altri tentativi di scrittura, impedendoli.
MA COME FARE??? Se avete link o volete scrivermi qualche pezzettino di codice...non so... mi sento frustato :cry:.
L'alternativa, poco elegante, sarebbe quella di gestire una tabella di storico sulle operazioni, dove viene riportata l'utenza e l'operazione, e dalla quale leggere lo stato della tabella prima di accedervi in scrittura eventualmente. Se la tabella riporta un'utenza in fase di scrittura allora a nessun'altra utenza sarà possibile scrivere. Ma come ho detto non mi piace come idea.
Grazie mille, confido in voi. :help: :help: :ave: