Re: [postgresql-it] [OT]php e galleria immagini

  • From: Manlio Perillo <manlio_perillo@xxxxxxxxx>
  • To: postgresql-it <postgresql-it@xxxxxxxxxxxxx>
  • Date: Thu, 22 Nov 2007 16:49:12 +0100

Daniele Varrazzo ha scritto:

[...]
A me è piaciuta molto la soluzione dei NOTIFY+LISTEN. Ha solo un problema: cosa succede se la transazione finisce ma la cancellazione fallisce?

Se la cancellazione fallisce, puoi riprovare più tardi.
Ma io mi chiederei: se una cancellazione dal filesystem fallisce, cosa significa?

In quali casi la cancellazione potrebbe fallire?
Il file non esiste più? Problemi di permessi? Ti si è rotto l'hard disk?

Questo stato è consistente? Ovviamente dipende dall'applicazione, ma secondo me lo è facilmente. Per esempio in questo stato avresti una foto nell'HD ma nessun record nel DB che dica il nome di quella foto, nessuna pagina che la usa. Forse la foto è raggiungibile comunque via web (es. mettendo a mano una url nel browser, se il file è servito staticamente dal server), ma non ci sono pagine che la linkano... pazienza :) Sarebbe peggio il contrario: una pagina senza foto sarebbe uno stato inconsistente.

Infatti.

Comunque, come ho scritto un problema "grosso" esiste con questa procedura "in differita".

Il problema consiste nel fatto che per il database un certo file, quando la transazione che cancella il nome del file dal database è terminata, non esiste più, mentre in realtà esiste ancora.

Che succede quindi se subito dopo vuoi creare un altro file con lo stesso nome?

Il database non si fa problemi, ma magari il processo esterno andrà a cancellare proprio quel nuovo file.

La soluzione, probabilmente, è fare in modo che un nuovo file non possa essere creato (nel filesystem) se ne esiste un altro con lo stesso nome, assumendo che le varie operazioni siano tutte atomiche.


Ovviamente a questo puoi affiancare uno script di pulizia, ma solo a scopo di manutenzione, come il vacuum che reclama le tuple inutilizzate.

Se vuoi restare transazionale usando strumenti interni al db puoi usare un commit a due fasi (PREPARE TRANSACTION e amici): solo che ti serve un sistema esterno al db che cancelli l'immagine e che sappia partecipare ad un protocollo di commit a due fasi.

Interessante.

Ma mi sembrerebbe di sparare alle mosche col cannone :)

Insomma, credo che la transazionalità non sia il fine ultimo, ma uno strumento per raggiungere la garanzia della consistenza, che credo sia una proprietà più debole e raggiungibile con altri mezzi.



Manlio Perillo

Other related posts: