Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    [MySQL] operazione atomica

    Ciao a tutti, ho un WS che esegue un chiamata per controllare ed assegnare un valore.

    Nel dettaglio ogni offerta (esempio) può avere massimo 7 iscritti; io ho ovviamente table (offerta) e subtable (iscritti).

    Ogni utente può quindi vedere se l'offerta ha "posti liberi" ed iscriversi... etc.
    Il tutto deve però essere atomico perchè la stessa cosa potrebbe essere chiesta da 3 utenti contemporaneamente.

    Come posso gestire quest situazione? considerando che gestisco le operazioni sul DB tramite chiamate da Web Service?
    Esempio "Chiamata controlla se sono disponibili posti nell'offerta" "Chiamata assegnami l'offerta" "Chiamata annulla l'offerta precedentemente a me assegnata" Ecc...


    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Nessun suggerimento ???

  3. #3
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    Sui miei "sacri testi" dicono che ti basta fare una transazione, dopo aver impostato il livello di "sicurezza" delle transazioni a quello maggiore.
    praticamente con
    set transaction isolation level serializable
    e
    set autocommit=1

    ti metti nella situazione più "sicura" (anche se più lenta)

    poi

    start transaction

    insert into qualcosa

    commit

    dovrebbe bastare

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    mmmm grazie per l'aiuto, come potrei applicare questa soluzione al mio contesto?

    Io eseguo queste operazione tramite un Web Service (file PHP che si connette al DB ed esegue query) eseguito da un'app android

    Quindi, considerando che il web service viene chiamato dall'app, come posso gestire l'operazione in modo "atomico" e ritornare il valore "locked" nel caso in cui stia operando un altro device?

    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Please help me!

  6. #6
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    ho capito il 10% di quanto hai scritto, inoltre so poco di mysql e pochissimo di php

    Comunque la prima cosa da dire è che, semplicemente, non tornerà mai "locked", perchè non lo sarà mai. Le richieste semplicemente saranno accodate (serializzate appunto). Questo le renderà più lente, però avrai la certezza che non si "pesteranno i piedi".

    Per fare da PHP... non mi è chiaro quale sia il problema (a parte che web service pensavo fosse tutt'altro... ma come detto sono niubbissimo).
    In pratica metti (dopo aver predisposto l'ambiente come sopra) start transaction; fai qualcosa; commit;

    Dovrebbe bastare

    EDIT: se invece qualcosa va storto, tipo non ci sono risorse libere, metti un rollback invece di commit e ritorni un qualche genere di errore

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Dimentichiamoci il PHP.

    Ho un record che ammette massimo 7 assegnatari.

    Ogni utente richiede l'assegnazione, se è libero eseguo alcune operazione e poi incremento il numero di assegnatari + 1

    Quindi ogni volta verifico se sono arrivato a 7 oppure no, per consentire di effettuare l'assegnazione, se non sono arrivato a 7 eseguo le operazioni e poi assegno l'utente

    1,2,3,4,5,6

    Cosa succede due utente, nello stesso istante fanno la richiesta ed ottengono che sono arrivati a 6 (quindi c'è disponibilità)?

  8. #8
    puo' esserti utile questa pillola sulle transazioni:

    http://forum.html.it/forum/showthrea...hreadid=603762

    @@edit - le tabelle devono essere InnoDB

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    Originariamente inviato da Valeria75_bis
    Dimentichiamoci il PHP.

    Ho un record che ammette massimo 7 assegnatari.

    Ogni utente richiede l'assegnazione, se è libero eseguo alcune operazione e poi incremento il numero di assegnatari + 1

    Quindi ogni volta verifico se sono arrivato a 7 oppure no, per consentire di effettuare l'assegnazione, se non sono arrivato a 7 eseguo le operazioni e poi assegno l'utente

    1,2,3,4,5,6

    Cosa succede due utente, nello stesso istante fanno la richiesta ed ottengono che sono arrivati a 6 (quindi c'è disponibilità)?
    non può accadere quanto scrivi, perchè i due utenti avrebbero le loro transazioni strettamente serializzate, una dopo l'altra.
    non in parallelo

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Strettamente serializzate quando??

    Hai letto il mio caso precedente??
    Posso avere massimo 6 deal
    Ne ho già assegnati 5
    L'utente X fa una richiesta (SELECT) e vede che c'è spazio .... aspetta 10 secondi prima di richiedere l'assegnazione
    L'utente Y fa una richiesta (SELECT) e vede che c'è spazio .... aspetta 4 secondi e richiede l'assegnazione

    L'utente X cosa?? aveva avuto il "semaforo" verde.....


    Altra domanda:

    cosa fa "SELECT * FROM your_table WHERE .... FOR UPDATE"

    Ho trovato esempi col "FOR UPDATE"

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.