View Full Version : [mysql] Transazione....
io dovrei fare una cosa del genere
SELECT m.*
FROM Messaggio m
IF(m.DeleteMit=1 AND m.DeleteDes=1)
THEN DELETE FROM m ELSE UPDATE m SET m.deleteMit = 1 ENDIF
WHERE m.Id = ?
cioe in pseudocodice
Messaggio m = new messaggio(IDMESSAGGIO)
if(m.deleteMit == 1 && m.deleteDes == 1){
CancellaMessaggio();
}else{
UpdateMessaggio();
}
esiste un modo per fare una trasazione in questo modo o devo farlo con la transazione in java..??
isAlreadyInUse
10-12-2007, 15:48
ELIMINA CON LA WHERE E POI LANCI L'UPDATE CHE SE, SE E' STATO ELIMINATO IL RECORD CHE DOVREBBE AGGIORNARE SEMPLICEMENTE NON FA NIENTE ALTRIMENTI AGGIORNA
SELECT m.*
FROM Messaggio m
IF(m.DeleteMit=1 AND m.DeleteDes=1)
THEN DELETE FROM m WHERE m.Id = ?
ELSE UPDATE m SET m.deleteMit = 1 WHERE m.Id = ?
ENDIF
dici cosi?:rolleyes:
isAlreadyInUse
10-12-2007, 15:55
Intendevo lanciarle separatamente
DELETE FROM MESSAGGIO WHERE DELETEMIT=1 AND DELETEDES=1 WHERE ID=?
Poi subito dopo lanci
UPDATE MESSAGGIO SET DELETEMIT=1 WHERE ID= ?
Cosi se l'hai eliminata, l'update non farà niente perche la condizione where non verra trovata.
:D :D :D :D :D
Sei proprio un FURBACCHIONE... :D
Guistissimo..
Ma questo se lo metto dentro una stessa query mi garantisce l'atomicità dell'operazione??
isAlreadyInUse
10-12-2007, 16:00
:asd:
isAlreadyInUse
10-12-2007, 16:06
Devi eseguirle separatamente una dopo l'altra
isAlreadyInUse
10-12-2007, 16:07
Magari se mi spieghi con precisione il meccanismo con il quale gestisci gli update e le delete ti posso dare una soluzione piu elegante
:asd:
SCUSAMI.... ma il problema è di nuovo presente..
Perchè io sono obbligato temporalmente prima a fare
UPDATE Messaggio SET DeleteMit=1 WHERE Id= ?;
oppure
UPDATE Messaggio SET DeleteDes=1 WHERE Id= ?;
poi devo eliminare il messaggio nel CASO dopo aver fatto l'update deve eliminare il Messaggio.. Questo per non trovarmi messaggi con tutti e due i campi ad 1..
:mad:
isAlreadyInUse
10-12-2007, 16:17
Allora un trigger che scatta dopo l'update e ti elimina nel caso ci siano le condizioni
Io nel Db devo avere solo messaggi con i campi deleteDes AND deleteMit != entrambi da 1..
se dopo un update si verifica che entrambi i campi sono ad 1 deve eseguira la DELETE..
Il problema che deve essere atomica...
Allora un trigger che scatta dopo l'update e ti elimina nel caso ci siano le condizioni
Ok... Forse ci siamo..
GRAZIE MILLE...
:ave:
isAlreadyInUse
10-12-2007, 16:19
Atomica?
Atomica?
Nel senso di transazione (rimasugli di c :D:D:D ).. anche se adesso con un trigger credo che non se ne abbia bisogno..
isAlreadyInUse
10-12-2007, 16:25
Secondome con un trigger fai piu bella figura :D
cdimauro
12-12-2007, 08:45
In MySQL non tutti gli engine sono transazionali: InnoDB e NDS (per realizzare cluster) sicuramente (forse anche BerkeleyDB, ma al momento non ricordo).
Quindi per eseguire "atomicamente" quelle operazioni ti serve un db che sfrutti uno di quegli engine.
Per il resto, potresti racchiuderle tutte in una stored procedure, che a partire da MySQL 5 sono supportate da MySQL (e idem per i trigger che, comunque, da soli NON risolvono certo il problema dell'atomicità dell'esecuzione delle operazioni).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.