Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Evitare un accesso concorrente ad un database (access)

    ciao, vi spiego il mio problema:
    ho una tabella con un campo posti disponibili (ex pd=3) e una tabella prenotazioni.
    ogni record della tabella prenotazioni conta per 1.

    il numero di prenotazioni (count(prenotazioni)) deve essere minore o uguale al numero di posti disponibili.

    quando devo inserire una prenotazione prima controllo la disponibilità:
    codice:
    SELECT (pd-COUNT(prenotazioni)) AS disponibili
    FROM tab_posti INNER JOIN tab_prenotazioni ON ...
    WHERE ...
    GROUP BY ...
    
    ...
    
    if Cint(rs("disponibili"))>0 then
        INSERT INTO tab_prenotazioni (...) VALUES (...)
    else
        Response.Write("Posti disponibili terminati")
    end if
    mettiamo che la count restituisca 1.
    Anche se il caso è mooolto raro, potrebbe accadere che in caso di contemporaneità di accesso magari due utenti ottengono 1 come risultato della count e per entrambi venga effettuata la insert. ovviamente questa è un eventualità che devo evitare.
    avete qualche suggerimento su come procedere? io pensavo di aprire la connessione al db in maniera esclusiva, ma non mi convince molto come soluzione. voi che mi dite?
    xxx

  2. #2
    Tempo fa ho letto questa discussione: http://forum.html.it/forum/showthrea...tabelle+access non so se ti può essere di aiuto.
    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  3. #3
    ti ringrazio per l'aiuto. ho dato una letta alla discussione (e a quelle linkate) ma la soluzione proposta non mi entusiasma.
    ho cercato tra i metodi dell'oggetto connection ma ho molte perplessità a riguardo.
    Ci sono idee per una soluzione pulita del problema?
    xxx

  4. #4
    up


    secondo voi una soluzione basata sull'application.lock potrebbe funzionare?
    qualcosa tipo:

    codice:
    Application.Lock
    
    sql = "SELECT COUNT(...) ..."
    Set rs = conn.Execute(sql)
    
    Application("disponibili") = rs(0)
    
    rs.Close: Set rs=nothing
    
    if CInt(Application("disponibili")) > 0 then
    	conn.Execute ("INSERT INTO ...")
    else
    	Response.Write ("Posti esauriti")
    end if
    
    Application.UnLock
    xxx

  5. #5
    up
    xxx

  6. #6
    Originariamente inviato da Alethesnake
    up


    secondo voi una soluzione basata sull'application.lock potrebbe funzionare?
    qualcosa tipo:

    codice:
    Application.Lock
    
    sql = "SELECT COUNT(...) ..."
    Set rs = conn.Execute(sql)
    
    Application("disponibili") = rs(0)
    
    rs.Close: Set rs=nothing
    
    if CInt(Application("disponibili")) > 0 then
    	conn.Execute ("INSERT INTO ...")
    else
    	Response.Write ("Posti esauriti")
    end if
    
    Application.UnLock
    si può fare ma dovresti mettere anche dei controlli in caso di errore per sbloccare il lock...

  7. #7
    si, sono stato molto sommario nell'esposizione, mi interessava un'opinione sul se secondo voi funzionava o no

    grazie

    xxx

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.