Ciao,
sto cercando di realizzare una transazione su due tabelle ma mi si presenta uno strano problema.
Se tento di eseguire l’operazione “normalmente” funziona tutto correttamente ma quando simulo la contemporaneità di due richieste (nella funzione che realizza la transazione ho inserito un ciclo per allungarne la durata di esecuzione) mentre la prima va a buon fine, la seconda attende (correttamente) che la prima abbia finito ma poi si blocca sulla query
codice:
SELECT disp FROM tab1 WHERE id = '" . $cliente . "' FOR UPDATE";
restituendo
Warning: mysql_query() [function.mysql-query]: Unable to save result set in
Ripetendo la singola seconda richiesta dopo qualche secondo funziona tutto correttamente.
Se tento le stesse operazioni facendo lavorare la transazione solo sulla prima tabella (“eliminando” la parte di codice relativa alla seconda ‘tabelenco’) le due richieste “contemporanee” vengono eseguite tranquillamente.
Questa la funzione incriminata:
codice:
function scala($cliente, $tipo, $connessione)
{
$totale = -1;
mysql_query("START TRANSACTION");
$query = "SELECT disp FROM tab1 WHERE id = '" . $cliente . "' FOR UPDATE";
$dbResult = mysql_query($query, $connessione);
$AffectedRows = mysql_affected_rows($connessione);
if ($AffectedRows > 0)
{
$app = mysql_fetch_row($dbResult);
if ($app[0] >= $tipo)
{
$codice = 0;
$query = "SELECT codice FROM tabelenco WHERE tipo = '" . $tipo . "' AND stato=0";
$dbResult = mysql_query($query, $connessione);
$AffectedRows = mysql_affected_rows($connessione);
if ($AffectedRows > 0)
{
$app1 = mysql_fetch_row($dbResult);
$i=0;
while ($i<10000)
{
$j=0;
while ($j<5000)
{
$j = $j + 1;
}
$i = $i + 1;
}
$query = "UPDATE tabelenco SET stato=1 WHERE codice = '" . $app1[0] . "'";
mysql_query($query, $connessione);
$codice = $app1[0];
}
if ($codice != 0)
{
$totale = $app[0] - $tipo;
$query = "UPDATE tab1 SET disp=" . $totale . " WHERE id = '" . $cliente . "'";
mysql_query($query, $connessione);
mysql_query("COMMIT", $connessione);
return $totale;
exit ;
}
}
}
mysql_query("ROLLBACK", $connessione);
return $totale;
}
Ogni suggerimento/consiglio/spiegazione/correzione è più che gradito