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

    Testare il lock delle tabelle con utenti multipli

    Come posso testare, in un server locale che il lock delle tabelle funzioni correttamente. Nel mio sito un utente di tipo y riceve ordini da un'utente di tipo x, come posso testare il click contemporaneo di 2 u piu utenti al pulsante "conferma ordine"?
    In modo da poter verificare che non ci siano problemi di scambio dati.
    Spero mi possiate aiutare! Grazie!!

  2. #2
    come lo gestisci questo lock ora?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Quando effettuo operazioni, come ad esempio un insert che richiedono un lock eseguo due query, una all'inizio e una dopo l'insert.

    mysql_query("mysql> LOCK TABLES");

    query con Insert dei dati

    mysql_query("mysql> UNLOCK TABLES");

  4. #4
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Non credo che scrivere unit test per testare deadlock/race condition etc. sia una buona idea, soprattutto in php.. dove immagino dovresti ricorrere a sporchi hack non sempre conclusivi.

  5. #5
    fai due script di prova, in uno fai una cosa del genere:

    - apri la connessione al database

    - fai il lock della tabella che ti interessa

    - metti uno sleep di qualche decina di secondi per simulare un'operazione pesante

    - togli il lock


    e poi fai un secondo script che esegue un'operazione di interesse sulla tabella con il lock dello script 1

    a questo punto esegui a mano prima lo script 1 e poi lo script 2 e vedi che succede

    in phpunit non saprei bene di preciso, ti basterebbe penso essere sicuro di usare due oggetti connessione (e quindi due sessioni mysql) differenti per eseguire i test, assicurandoti di lanciare il primo script (quello con lo sleep) in background e il secondo normalmente eseguito dal test


    cmq ti assicuro che il lock di mysql, quelli di mysql, lo hanno implementato bene. Se vuoi testare il comportamento del tuo applicativo quando incorre nel "attenzione! non posso scrivere perchè la tabella ha il lock", non è questa la strada giusta, si usano i mock per simulare il comportamento dei componenti
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Non credo di aver capito
    Cioè è sbagliato il modo in cui gestisco i lock? Oppure per il modo in cui li gestisco non c'è molto da fare?

  7. #7
    Allora, tu fai il lock su una tabella per, immagino, diminuire la disponibilità di un prodotto o qualcosa di simile. Quindi diciamo che hai

    Codice PHP:

    $link 
    mysqli_connect("localhost""my_user""my_password""world");

    mysqli_query($link"LOCK TABLES magazzino WRITE");

    mysqli_query($link"update magazzino set disponibilita = disponibilita -1 where id = XXX");

    mysqli_query($link"UNLOCK TABLES magazzino");

    ... 
    te che vuoi sapere, se mysql gestisce bene il lock, o come si comporta la tua applicazione se prova a modificare la quantità di magazzino mentre c'è già un altro script che sta facendo la medesima operazione? (per non parlare del fatto di fare il lock solo a livello di row della tabella e non a livello di tutta la tabella, se non è necessario) no perchè nel primo caso, i programmatori di mysql sono sufficientemente bravi da essere noi sicuri che i meccanismi di lock funzionino, nel secondo caso, se usi unit testing puoi usare dei mock delle parti che ti interessano per lanciare eccezioni o tornare risultati che... vabbeh non penso che tu sappia di cosa stia parlando
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    43
    Quote Originariamente inviata da LuigiDaddario Visualizza il messaggio
    Quando effettuo operazioni, come ad esempio un insert che richiedono un lock eseguo due query, una all'inizio e una dopo l'insert.

    mysql_query("mysql> LOCK TABLES");

    query con Insert dei dati

    mysql_query("mysql> UNLOCK TABLES");
    Effettuare un lock di tabelle per eseguire una singola operazione di insert non ha alcun senso. Se più client stanno tentando di aggiungere record sul db, non vedo come questi possano danneggiarsi vicendevolemente.

    Il lock ha senso in altri contesti, ad esempio per essere sicuri che nessuno alteri il contenuto di una tabella mentre ne sto leggendo e modificando il contenuto.
    Ti consiglio la lettura di testi che trattano le problematiche di concorrenza, per comprenderne il significato:
    http://users.dimi.uniud.it/~angelo.montanari/concorrenza.pdf

  9. #9
    In ogni caso ha piu' senso usare le transaction (se devi fare piu' query senza "interferenze") invece di mettere manualmente i lock.

Tag per questa discussione

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