Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 43
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    466

    [Aspirante Pillola]MySql e transazioni

    Premetto che cercherò di semplificare al massimo l’ argomento per facilitarne la comprensione il più possibile.

    Per prima cosa diciamo cosa è una transazione:

    “Una transazione è un insieme parzialmente ordinato di operazioni di lettura e scrittura; essa costituisce l’ effetto dell’ esecuzione di programmi che effettuano le funzioni desiderate dagli utenti”

    Perché sono importanti le transazioni?

    Perché quando compiamo operazioni su di un database dobbiamo SEMPRE garantire l’integrità dei dati e della struttura oltre a garantire che le operazioni che vengono effettuate su questo vadano a buon fine senza creare incongruenze od errori.

    Per chiarire meglio facciamo un semplice esempio.

    Supponiamo di operare su di una tabella così strutturata:

    Prodotti(IdProdotto, Descrizione, Qta).

    Il campo Qta si riferisce alla quantità di prodotto attualmente disponibile a magazzino.

    Supponiamo di avere un record simile a questo:

    IdProdotto Descrizione Qta
    123 Scarpe 10

    Abbiamo on-line due clienti, A e B ed entrambi vogliono comprare quel particolare articolo (il cui codice prodotto è123), A ne vuole 3 e B ne vuole 8.

    Le operazione che verranno effettuate sul database saranno all’ incirca queste:

    SELECT Qta FROM Prodotti WHERE IdProdotto=123 (1)
    ….
    ….
    //Codice di controllo sulla quantità che non deve essere inferiore a 3
    ….
    ….
    UPDATE Prodotto SET Qta=Qta-3 WHERE IdProdotto=123 (2)


    Vista così potrebbe sembrare corretta, ma cosa succede se ad esempio A e B vengono processati dal sistema contemporaneamente e questo è possibile (sarebbe interessante fare una postilla sui thread ma non è questo il nostro scopo), soprattutto in sistemi di vendita on-line molto frequentati, per non parlare dei sistemi di transazione bancaria.

    Succede che A (o meglio il thread A) esegue la query 1 e vede che ci sono dieci articoli disponibili, B esegue anch’ essa la query numero 1 e vede che ci sono 10 articoli disponibili così entrambi fanno il loro ordine. A questo punto A aggiorna il valore di Qta a 7 (10-3) e subito dopo B fa la medesima cosa mettendolo a 2 (10-8).

    E’ evidente quale sia il problema, entrambi i thread hanno processato i dati in maniera indipendene generando informazioni sbagliate.

    La soluzione consiste nel gestire l’ accesso alle informazioni (quindi alle tabelle) in modo esclusivo.

    Come possiamo mettere in pratica questa soluzione?

    Utilizzando i meccanismi di LOCK e UNLOCK sulle tabelle.

    La sintassi è la seguente:

    LOCK TABLES nome_tabella [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
    [, nome_tabella [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
    ...
    UNLOCK TABLES


    E’ necessario chiarire il significato delle opzioni di lock, in particolare:

    - READ : se un thread ottiene un lock in lettura su di una tabella questo thread e tutti gli altri thread potranno solo leggere dalla tabella
    - WRITE :se un thread ottiene un lock in scrittura su di una tabella solo questo thread potrà leggere o scrivere nella tabella, tutti gli altri saranno bloccati
    - READ LOCAL : simile al bloccaggio in lettura ma permette ad altri thread di inserire dati
    - LOW PRIORITY : questa opzione o attributo si può applicare al lock in scrittura e assegna a tale lock una priorità più bassa rispetto a quello in lettura

    Quindi nel nostro caso avremo:

    LOCK TABLES Prodotti WRITE;
    SELECT Qta FROM Prodotti WHERE IdProdotto=123;
    ….
    ….
    //Codice che controlla che Qta nonsia minore di 3 ed eventuali altricontrolli
    ….
    ….
    UPDATE Prodotti SET Qta=Qta-3 WHERE IdProdotto=123;
    UNLOCK TABLES;


    Ovviamente nessuno Vi vieta di bloccare più tabelle in modalità diverse se fosse necessario.

    Questa soluzione per quanto pratica ha uno svantaggio che risiede nel fatto che viene bloccata l’ intera tabella. E questo è uno spreco di risorse, infatti nel nostro caso sarebbe stato sufficiente bloccare il record relativo al prodotto con IdProdotto=123.

    Questo è possibile e per farlo è necessario utilizzare le transazioni vere e proprie che permettono operazioni di commit e rollback.

    Mi fermo qui perché non so se l’ argomento relativo alle transazioni possa interessare o meno, anche considerando che per la maggior parte di noi (almeno penso) questi meccanismi dovrebbero essere sufficienti.

    Ciao a tutti, Mc

  2. #2

    Re: [Aspirante Pillola]MySql e transazioni

    Originariamente inviato da mchorney

    Mi fermo qui perché non so se l’ argomento relativo alle transazioni possa interessare o meno, anche considerando che per la maggior parte di noi (almeno penso) questi meccanismi dovrebbero essere sufficienti.

    Ciao a tutti, Mc
    ma sei matto? continua!!
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  3. #3
    mmm ma cosi se devo stoppare l'esecuzione dei comandi...non posso

    le transazioni reali (commit e co) mi ripristinano lo stato del db a quello prima delle operazioni se nn do il commit :\

    cmq è interessante, xche questo sistema può essere usato dove non è necessaria una cosa del genere

  4. #4
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    forse hai dimenticato di dirlo o forse sono poko aggiornato io, cmq io sapevo che le transazioni allo stato attuale erano supportate solo dalle tabelle di tipo innoDB

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    466
    Volevo fare anche la parte sulle transazioni con relativa spiegazione su come utilizzare commit e rolback ma prima volgio vedere se interessa.

    Questa tecnica ha il vantaggio di poter essere usata sulle tabelle standard, quindi MyISAM mentre per le transazioni vere e proprie bisonga utilizzare o le InnoDB (che consiglio) o le BDB.

    Ciao, Mc

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    466
    Krual, scusa se ho risposto solo ora ma mi era crashata la linea.


  7. #7
    Ciao,
    il vantaggio della prima tecnica descritta da mchorney rispetto al LOCK sta nel fatto che il blocco "empirico" agisce a livello di record e non sull'intera tabella, lasciando libero il resto dei record per le operazioni che non entrano in conflitto.

    Da qualche tempo Mysql supporta la funzione get_lock(ID, TIMEOUT) che può essere usata allo stesso scopo
    per favore NIENTE PVT TECNICI da sconosciuti

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    466
    Scusate se mi ripeto ma se volete posso aggiungereanche la parte sulle transazioni veree proprie.

    Dite e sarete accontentati

    Mc

  9. #9
    Originariamente inviato da mchorney
    Scusate se mi ripeto ma se volete posso aggiungereanche la parte sulle transazioni veree proprie.

    Dite e sarete accontentati

    Mc
    Direi che sarebbe utile
    per favore NIENTE PVT TECNICI da sconosciuti

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    466
    Allora domanimattina la finisco

    Se volete che tocchi qualche argomento in particolare postate.


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.