Transazione per accesso concorrente a una tabella

luke1979

Nuovo Utente
24 Apr 2015
3
0
0
Ciao a tutti, ho un problema che non riesco a risolvere. Ho letto sul manuale di mysql ma non ne vengo a capo:

il problema è questo,
i clienti possono inviare delle richieste di prenotazione alle attività commerciali,
l'attività commerciale periodicamente verifica se ci sono delle nuove richieste di prenotazione e se le trova per ognuna di esse dovrà accettare o rifiutare la prenotazione.

Ho una tabella prenotazioni con i seguenti campi:
id (chiave primaria della tabella)
idCliente
idAttivita
stato (accettata, rifiutata o null)
sospesa (true o false)
testo (testo che il cliente scrive quando fa una prenotazione)

Ipotizzando di avere più postazioni all'interno dell'attività che contemporaneamente visualizzano le nuove richieste di prenotazione e decidono se accettarle, rifiutarle o non fare nulla, vorrei che se una richiesta è già visualizzata sul display di un addetto non venga visualizzata anche su quello di un altro.
Ho pensato di usare una trasazione tipo questa nella classe java che fa il check se ci sono nuove richieste:

1) inizio transazione
2) leggo dalla tabella prenotazioni quelle dove idAttività è quello dell'attività interessata e dove sospesa = false e dove stato = null
3) faccio un update per rendere sospesa = true sugli stessi record della select sopra al punto 2
4) fine transazione

quando la classe rifà la verifica per un altro addetto dell'attività selezionerà solo quelle dove sospesa = false come dal punto 2 e quindi non rivisualizza quelle che sono visualizzate su un altro schermo di un altro addetto. Quando l'addetto accetta o rifiuta o non fa nulla riguardo ad una prenotazione e passa alla successiva visualizzata sul suo display il campo sospesa viene posto = false così che un altro addetto alla prossima verifica periodica può vedere la richiesta nel caso in cui non sia ancora stata accettata o rifiutata.

Mi domando? Il punto 2 può essere eseguito in contemporanea prima che avvenga il punto 3 dell'update da più addetti qudini più addetti visualizzeranno le stesse richieste, allora ho pensato che potrei usare nel punto 2 una SELECT ... LOCK IN SHARE MODE oppure una SELECT .. FOR UPDATE, ma non riesco bene a capire dal manuale come funzionano.
La lock in share mode aspetta che sia finita ogni altra operazione in altre transazioni sui record della select prima di eseguirla... ma mi domando se due select lock in share mode vengono eseguite insieme prima che parta un'update del punto 3 anch'esse leggeranno le stesse richieste e non va bene.
La select for update invece forse potrebbe andare bene perchè oltre a mettere un blocco di scrittura da parte delle altre richieste sui record ne impedisce anche la scrittura? Alcuni manuali dicono così, altri il contrario quidni non lo riesco a capire.

Altrimenti potrei evitare di usare le transazioni e far visualizzare anche le stesse richieste e quando un addetto prende una decisione di accettare o rifiutare, se lo stato è già diverso da null non prendo in considerazione la sua decisione perchè la richiesta è già stata evasa da un altro addetto. Però questa soluzione porterebbe ad una gran perdita di tempo per tutti gli addetti che ogni qualvolta devono accettare o rifiutare la prenotazione devono andare a controllare la disponibilità nella lista degli appuntamenti ed è appunto tempo sprecato che se un addetto ha già evaso una richiesta anche tutti gli altri che magari sono centinaia di addetti debbano andare inutilmente a controllare la lista appuntamenti per prendere una decisione che poi non srevirà a nulla perchè la richiesta è già stata evasa.

Ringrazio tantissimo chi mi può aiutare perchè non riesco ad uscirne...
 

Discussioni simili