Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296

    Sistema esecuzione comandi a scadenza

    Ciao a tutti,

    sto cercando di studiare la soluzione ottimale a questo problema:

    piu' utenti eseguono azioni su una tabella di un DB in comune, SELECT, INSERT, UPDATE, DELETE.

    Le operazioni pero' non sono svolte istantaneamente ma dovranno essere eseguite ad un orario prestabilito.

    Es.
    INSERT ecc. , alle ore 21:12:15
    SELECT ecc. , alle ore 21:56:01
    DELETE ecc., alle ore 21:20:14

    Come da esempio sopra, quando verrà eseguita la select la delete deve essere già stata eseguita. Fondamentale nell'applicazione è quindi seguire l'ordine per DATAORA.



    Io ho pensato di risolvere il problema come segue.

    Creo un DB che chiamero' operazioni.
    Nel DB c'è:

    ID progressiovo
    SQL query da eseguire
    DATAORA in cui andranno eseguite le query


    Ogni utente, ad ogni visita, lancia nella propria pagina ASP una select per verificare se ci sono delle operazioni ancora da svolgere.

    Se sono presenti delle operazioni con dataora antecedente alla dataora del caricamento della pagina, le operazioni vengono ordinate per DATAORA ed eseguite.

    L'unico problema è la gestione della contemporaneità, cioè se mentre un utente sta eseguendo una query sul DB OPERAZIONI, gli altri utenti non DEVONO poterci accedere.
    Avevo pensato quindi ad una variabile (aplication, oppure un txt) che BLOCCHI l'accesso al DB ad un utente per volta. Altrimenti puo' succedere che 2 utenti eseguono 2 volte le stesse query in contemporanea sul DB creando un bel casino.

    Conoscete un sistema piu' professionale per gestire queste esigenze?

  2. #2
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Le operazioni pianificate, ma solo se hai accesso al server.
    Altrimenti quello che hai immaginato tu può andare bene...

    Roby

  3. #3
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Sono in hosting. Ho la possibilità di utilizzare le operazioni pianificate ma solo ogni mezz'ora.

    In questo caso la necessità di eseguire operazioni pianificate ogni secondo.

    Un po' pesante direi... anche perchè potrebbe crearsi il caso che una serie di operazioni richiedano piu' di 1 secondo, diciamo ad esempio 3, e quindi le successive 3 operazioni pianificate non potrebbero accedere al DB perchè in stato di LOCK, andando a creare una coda di operazioni da svolgere, che potrebbe poi piantare il server (in casi estremi).


    Leggevo che mysql offre la possibiltià di passare ad un DB che supporta le transazioni.

    Non so se rispecchia nello specifico il mio caso. Inoltre non so se il mio host lo supporta.
    Mi documenterò circa l'hosting.

  4. #4
    Ciao,

    Secondo me la cosa più semplice è gestire la cosa tramite application:

    codice:
    If Not Application("lock") Then
        Application.Lock
       
        Application("lock") = True
    
        'INSERT
        'SELECT
        'DELETE
    
        Application("lock") = False    
    
        Application.Unlock
    Else
        Response.Write ("Try later!")
    End If
    In alternativa/aggiunta potresti aprire la connessione al db in maniera esclusiva (mode= adModeShareExclusive).
    xxx

  5. #5
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Si infatti, l'avevo studiata così.

    Pero' non sapevo se c'erano magari altri approcci a questa tipologia di problema.

    Ad esempio MySql supporta il LOCK sulle tabelle e mette temporaneamente in attesa le query.

  6. #6
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Ad esempio nel caso in cui una pagina andasse per qualche motivo in crash, l'application magari rimane aperta, e non vengono piu' applicate le query....

    Invece con MySql e il LOCK se si chiude la connessione (mal che vada c'è il time out) la tabella si sblocca.

  7. #7
    Originariamente inviato da barney09
    Ad esempio nel caso in cui una pagina andasse per qualche motivo in crash, l'application magari rimane aperta, e non vengono piu' applicate le query....

    Invece con MySql e il LOCK se si chiude la connessione (mal che vada c'è il time out) la tabella si sblocca.
    Già, ma resterebbe sempre un periodo di inaccessibilità al database (non fino al riavvio del server in questo caso ovviamente).

    Comunque con un po' di error handling anche il fatto che la connessione resti appesa (o l'application bloccata) si può limitare molto. Non amando molto i salti che fa fare l'On Error Resume/GoTo ho prenderei in considerazione anche questa (ho fatto il test sull'applicazione e non sulla connessione, ma va bene lo stesso):

    codice:
    <script language="JScript" runat="server">
    function Test()
    {
    	if(!Application("lock"))
    	{
    		try
    		{
    			Application.Lock;
    			Application("lock")=true;
    			
    			Response.Write("
    INSERT..");
    			Response.Write("
    SELECT..");
    			
    			Server.CreateObject("Fammi un errore a caso");
    			
    			Response.Write("
    DELETE..");
    		}
    		catch(e)
    		{
    			Response.Write("
    Ho sbagliato..");
    		}
    		finally
    		{
    			Application("lock")=false;
    			Application.Unlock;
    			Response.Write("
    Bye bye!");
    		}
    	}
    }
    
    Response.Write ("Stato applicazione: " + Application("lock"));
    
    Test();
    
    Response.Write ("
    Stato application: " + Application("lock"));
    </script>
    xxx

  8. #8
    Volendo puoi aggiungere lo "sblocco" dell'application anche sul session on_end del global.asa, qualora risulti bloccata, ma in questo caso nell'application devi salvarti anche un identificativo dell'utente (il sessionid o quello che vuoi) in modo da poter verificare se sta scadendo la stessa sessione che ha impostato il lock sull'application e in tal caso sbloccarla.
    A dirla tutta puoi salvarti anche solo il sessionid, poi prima di andare a fare le modifiche sul db controlli che l'application sia vuota altrimenti significa che ci sta lavorando qualcun'altro.
    xxx

  9. #9
    Utente di HTML.it L'avatar di barney09
    Registrato dal
    Dec 2000
    Messaggi
    1,296
    Non conosco bene il linguaggio javascript e la sua gestione degli errori, io uso il VBScript.

    Mi documenterò sicuramente, alla fine si tratta di una cosa molto semplice a livello di programmazione.

    Si potrebbe anche salvare in un altra application data e ora di quando è avvenuta l'ultimo LOCK e se sono passati piu' di 1 minuto, togliere il lock e rieseguire, magari segnalando con un email.

    Al di la di qualche inevitabiel bug nella prima fase, una volta rodato il sistema dovrebbe comunque risultare stabile.... si spera...

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.