434 messaggi dal 08 aprile 2009
Salve.
Ho la necessità di effettuare un lock su una tabella.
utilizzo le transazione ed ho impostato il IsolationLevel a Serializable.
Il problema è che il lock avviene al primo aggiornamento di un record mentre io lo devo loccare nel momento in cui lo leggo.

Devo per forza fare un update fantasma?
Che versione di sql stai usando? è MS o MySql?

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
434 messaggi dal 08 aprile 2009
MS 2005
In generale non è mai buona norma inserire business logic nel db. Ti consiglierei di inserire un timestamp a bordo del record e gestire il lock a livello di applicazione.

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
434 messaggi dal 08 aprile 2009
ok.
è un servizio web.
Che intendi per timestamp???
potresti usare un campo bit per indicare semplicemente che il record è "bloccato", oppure se vuoi maggiori info, un campo datetime nullable che indica, se diverso da NULL, la data esatta dell'ultima operazione di lock

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
434 messaggi dal 08 aprile 2009
Si avevo pensato anche a questo ma il problema è che se un record è bloccato la richiesta deve rimanere in attesa fino a che è blollato.

Adesso ho fatto questa prova:
1.Apro la transazione
2.Faccio una update fantasma sul record in modo tale che viene bloccato
3.Effetto tutte le operazioni e se vado in errore faccio il rollback in modo tale che sblocca il record
4.Faccio l'update effettiva
5.Commit

Ho fatto il test lanciando due processi. Arriva il primo e fino a che non effettua l'update fantasma non viene bloccato il record.
Il secondo processo rimane in attesa fino a quando il primo non ha terminato e legge i dati aggiornati dal primo.

Mi sembra una buona soluzione per il mio problema solo che se succede qualcosa tipo va in crash il servizio il record potrebbe rimanere bloccato e essendo pubblicato su un dominio register non gestisco io il motore del data base.
potresti creare una coda delle richieste ed elaborarla in un thread secondario gestito da un servizio sul server. In questo modo le richieste vengono inviate senza bloccare l'interfaccia (se presente) e gestite in maniera sequenziale senza problemi

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.