Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    30

    Lock tabelle e query multiple

    Salve a tutti,
    ho un'applicazione di gestione magazzino e ho la necessità di utilizzare i lock su alcune tabelle mysql (tbmovimenti, tbgiacenza, ecc...) e di eseguire, all'interno del blocco lock....unlock, diverse query (select, update e delete) sulla una delle relative tabelle (tbmovimenti): in fase di lock quante volte devo indicare la tabella in questione?Leggevo che occorre utilizzare diversi alias?
    In tal caso quale è la sintassi?

    Ho provato ad implementarle ma ogni volta che eseguo lo script il server sembra che si blocca o resta in attesa

    Il codice è simile al seguente

    $sqllock="LOCK TABLES tbgiacenze WRITE, tbmovimenti WRITE,tbmovimenti AS tbmovi1 WRITE, tbmovimenti AS tbmovi2 WRITE, tbmovimenti AS tbmovi3 WRITE, tbmovimenti AS tbmovi4 WRITE, tbprotocollo WRITE, tbsegnalazioni WRITE";

    //ciclo for per scorrere gli articoli da scaricare
    for($i=0; $i<$numeroarticoli; $i++)
    {

    //calcolo la giacenza in prima di effettuare l'operazione di scarico
    $qiacecenzacalcolataprima=$this->calcolagiacenzaarticolo("tbmovi1,$idarticolo[$i],$datascadenza[$i],$confezione[$i], $posizione[$i], $unitamisura[$i]);

    if (($qiacecenzacalcolataprima >=0) && ($qiacecenzacalcolataprima >=$quantitascaricata)){

    $sqlinsert="INSERT INTO tbmovimenti VALUES
    (NULL,\"U\",\"$datamovimentoENG\",\"$protocollo\", \"" . $idanagrafica . "\",\"" . $idarticolo[$i] . "\",\"" . $idaccount . "\",\"" . $unitamisura[$i] . "\",\"$quantitascaricata\",\"" . $confezione[$i] . "\",\"\",\"0\",\"$nomefile\",\"" . $produttore[$i] . "\",\"" . $datascadenza[$i] . "\",\"" . $posizione[$i] . "\",\"$flag\",\"$datains\",\"$mittentedestinatario \",\"$idcausale\")";

    $esito=@mysql_query($sqlinsert,$conn);

    if (@mysql_affected_rows($conn) == 1)
    {
    $idmovimento=mysql_insert_id($conn);

    //per eccesso di zelo ricalcolo la giacenza dopo aver effettuato l'operazione di scarico
    //per verificare se ci sono problemi di giacenza ed in tal caso elimino il movimento effettuato

    $qiacecenzacalcolatadopo=$this->calcolagiacenzaarticolo("tbmovi3","tbmovi4",$idar ticolo[$i],$datascadenza[$i],$confezione[$i], $posizione[$i], $unitamisura[$i]);


    if ($qiacecenzacalcolatadopo < 0)
    {
    $sqldelete="delete from tbmovimenti as tbmovi5 where IdMovimento=$idmovimento";
    $esito=@mysql_query($sqldelete);

    $report .="Operazione di scarico annullata per l'articolo " . $descrizioneapp . ": la giacenza disponibile risulta inferiore alla quantita' da scaricare
    ";
    }
    else
    {
    // aggiorno una tabella di appoggio
    $this->aggiornagiacenza($conn);
    $recordcaricati += 1;
    }

    }
    else
    {
    $report.="Operazione di scarico annullata per l'artitolo " . $descrizioneapp . ": si è verificato un errore in fase di registrazione.
    ";
    }
    }
    else
    {
    $report.="Si è verificato un errore in fase di recupero dati dell'articolo " . $descrizioneapp . "
    ";
    }
    }
    }
    else
    {
    #$report .= "Attenzione, operazione di scarico annullata per l'artitolo " . $descrizione[$i] . ": la quantita' indicata non e' numerica
    ";
    }

    }
    //qui è terminato il ciclo for e sblocco le tabelle

    $sqlunlock="UNLOCK TABLES";
    $esitounlock=@mysql_query($sqlunlock,$conn);


    Grazie.
    David.

  2. #2
    Se fai operazioni solo su tbmovimenti non hai bisogno di lockare le altre tabelle.

    Hai provato solamente con
    Codice PHP:
    LOCK TABLES tbmovimenti WRITE 
    ?

    In alternativa... sei sicuro che per il resto funzioni tutto e che lo script arrivi all'UNLOCK? Perchè da quel che dici sembra proprio che si fermi prima.

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Fare più di un lock in write sulla stessa tabella non mi sembra un'idea grandiosa

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    30
    Se elimino il lock, il software funziona senza problemi.
    Il lock sulle altre tabelle è dovuto al fatto che, nel codice appositamente non ho riportato, devo lavorare anche su altre tabelle.

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    "Altre tabelle" è una cosa. Nel codice che hai postato c'erano n lock sulla STESSA tabella, e tutti in scrittura. Mi sembra naturale che si pianti, in quella condizione.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    30
    Salve Luca,
    quindi, dovendo lanciare diverse query sulla stessa tabella, non ho la necessità di creare diversi alias (es. lock tables tbarticoli write, tbarticoli as tbart1 write, ecc...
    )?
    Ed è errato effettuare diversi lock write sulla stessa tabella?

    Se non erro questa info l'avevo trovata nella guida mysql.

    Grazie
    David.

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da piaccapi
    quindi, dovendo lanciare diverse query sulla stessa tabella, non ho la necessità di creare diversi alias (es. lock tables tbarticoli write, tbarticoli as tbart1 write, ecc...
    )?
    Certo che no. La necessità ce l'hai se usi alias diversi, e gli alias diversi eventualmente ti possono servire se la tabella è referenziata più volte sulla STESSA query.


    Originariamente inviato da piaccapi
    Ed è errato effettuare diversi lock write sulla stessa tabella?
    Ovvio. I lock in scrittura, per definizione, possono essere dati uno alla volta. Se tu cerchi di prenderne due, il secondo aspetterà che il primo venga rilasciato, e così rimarrai lì fino alla fine dei tuoi giorni.


    Originariamente inviato da piaccapi
    Se non erro questa info l'avevo trovata nella guida mysql.
    QUALE?!!? Se parli della guida che c'è su questo sito, l'ho scritta io quindi mi auguro non ci siano strafalcioni. Cosa hai letto esattamente?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    30
    Prima di tutto grazie,
    non parlavo della tua guida ma di questa:
    http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
    mi sembrava di aver capito che occorrevano diversi alias

    David.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.