PDA

View Full Version : [MySQL] Come implemento le transazioni?!


Matrixbob
21-06-2005, 09:16
Mi han detto che è 1 cavolata, metti un comando prima di manipolare le tabelle e poi 1 commit ed 1 rollback a seconda del caso.

Tutto qui?! :confused:

tglman
21-06-2005, 15:43
In mysql non lo so ma ti posso dire che per esempio oracle non rende definitiva un'azione fino a quando non esegui un commit, e se hai sbagliato puoi eseguire un semplice rollback.

Quindi presumibilmente in mysql è molto simile.....
Ciao

beppegrillo
21-06-2005, 16:14
Mi han detto che è 1 cavolata, metti un comando prima di manipolare le tabelle e poi 1 commit ed 1 roolback a seconda del caso.

Tutto qui?! :confused:
begin transaction
blah blah
commit work;
end transaction

maulattu
21-06-2005, 16:36
begin transaction
blah blah
commit work;
end transaction

se invece usi (x es.) java con le librerie mysql:
con.setAutocommit(false); // con è un oggetto di tipo Connection)
// fai tutto quel che vuoi col db
con.commit(); //se tutto ok
// altrimenti scrivi: con.rollback();

:D

Matrixbob
21-06-2005, 16:50
begin transaction
blah blah
commit work;
end transaction
Cioè le "parole chiave" qui sono:
1] begin transaction
2] commit work;
3] end transaction
4] ma per fare il rollback in caso che la modifica su una tabella è andata storta?!

... conviene sempre usarle le transazioni?! o quando?!

Matrixbob
21-06-2005, 16:52
se invece usi (x es.) java con le librerie mysql:
con.setAutocommit(false); // con è un oggetto di tipo Connection)
// fai tutto quel che vuoi col db
con.commit(); //se tutto ok
// altrimenti scrivi: con.rollback();

:D
Giusto, dovrei fare una parte anche in tecnologia JAVA e quindi Serlvelt o JSP, qui invece come funzionano le transazioni?!

cionci
21-06-2005, 17:24
http://dev.mysql.com/doc/mysql/en/commit.html

Matrixbob
21-06-2005, 17:41
http://dev.mysql.com/doc/mysql/en/commit.html
Mi mancava Cionci!! :)
Sai mica come faccio questo:
SET AUTOCOMMIT=0; ?!

cionci
21-06-2005, 18:20
Lo invii come se fosse una query...ovviamente come prima istruzioen della connessione che stai usando...ma controllane prima il valore, magari è già a zero...

Matrixbob
21-06-2005, 18:52
Lo invii come se fosse una query...ovviamente come prima istruzioen della connessione che stai usando...ma controllane prima il valore, magari è già a zero...

// connessione al DB ?!
$sqlquery = "SET AUTOCOMMIT=0";
$queryresult = mysql_query($sqlquery, $connessione) or die(errore());
// altre istruzioni o disconnessione quindi?!

Così?!

cionci
21-06-2005, 18:55
Sì...

Matrixbob
21-06-2005, 18:58
Sì...
Mi sento imbecille :fagiano:, e per vedere come hai detto tu se è settato ti ricordi mica come si fa invece?!

cionci
21-06-2005, 19:02
http://dev.mysql.com/doc/mysql/en/set-option.html

Matrixbob
23-06-2005, 11:00
http://dev.mysql.com/doc/mysql/en/set-option.html
Anzitutto, ma quando vanno usate le transazioni?!
Quando processi in concorrenza vogliono scrivere nel db?!
Quindi ad esempio per la prenotazione di posti x 1 qualche evento?!
Quindi non quando un utente si iscrive al sito, giusto?!

Adesso provo a tradurmi quell'inglese, ma mi sa mio malgrado che dovrò chiedere ancora a voi, non me la cavo benissmo con le lingue ... :(

cionci
23-06-2005, 12:22
Le transazioni servono per un accesso concorrente quando dovresti altrimenti bloccare un macello di tabelle...
MySQL offre anche una politica di locking con le istruzioni LOCK e UNLOCK...

maulattu
23-06-2005, 12:50
ci sono anche diverse modalità per la loro gestione, tipo read-committed ed altre che troverai sul sito.
quella più sicura (ma anche drastica) è serialized, cioè permette UN UNICO COMPITO PER VOLTA...nella maggior parte dei casi è molto restrittiva...

cionci
23-06-2005, 12:54
Comunque leggi bene quel capitolo... Con START TRANSACTION, AUTOCOMMIT è implicitamente settato a 0...

Matrixbob
23-06-2005, 13:33
Comunque leggi bene quel capitolo... Con START TRANSACTION, AUTOCOMMIT è implicitamente settato a 0...
Quindi una volta che uso quelle istruzioni lui si autosetta a 0?!
Non ho capito na mazza?!

... ho letto alla veloce perchè sto pensando a come mandare in esecuzione 10 quesri che deve fare il gestore del sito ... :(

cionci
23-06-2005, 14:08
Quindi una volta che uso quelle istruzioni lui si autosetta a 0?!
Sì...la START TRANSACTION imposta atomaticamente autocommit a 0 fino al prossimo COMMIT o ROLLBACK...

Matrixbob
18-07-2005, 20:06
Sì...la START TRANSACTION imposta atomaticamente autocommit a 0 fino al prossimo COMMIT o ROLLBACK...
Secondo voi è possibile mantenere la transazione aperta anche passando da pagina in pagina?! Forse se non chiudo la connessione al DBMS c'è la fa.
Purtroppo solo stasera o domani proverò quanto detto in questo 3D.
CMQ me lo tengo stretto mitico cionci. :)

Matrixbob
19-07-2005, 13:46
Alla fine mi sono arrangiato come segue: va bene secondo voi?!
PHP e MySQL sembrano non dare errori.

<?php

$START_TRANSACTION = "START TRANSACTION";
$COMMIT = "COMMIT";
$ROLLBACK = "ROLLBACK";

//inizio le operazioni atomiche
mysql_query($START_TRANSACTION) or die(errore());

[ queryresult5 ]
[ queryresult6 ]
[ queryresult7 ]

//finisco le operazioni atomiche
if ($queryresult5 && $queryresult6 && $queryresult7) {
mysql_query($COMMIT) or die(errore());
print("<font color=\"green\">COMMIT!</font><br /><br />\n");
}
else {
mysql_query($ROLLBACK) or die(errore());
print("<font color=\"red\">ROLLBACK!</font><br /><br />\n");
}
?>


... Cionci ... :rolleyes: ... :stordita:

Tenendo presente la condizione che prendo per vera:

"... con START TRANSACTION l'autocommit si setta a 0 fino al COMMIT/ROLLBACK da solo".

Intuita qui:
http://dev.mysql.com/doc/mysql/en/commit.html

cionci
19-07-2005, 18:11
Ad occhio mi sembra di sì...