Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MySQL (Autocommit + transakcje) + PHP = Boom
Forum PHP.pl > Forum > Bazy danych > MySQL
PiotrPietak
Witam wszystkich
Mam problem z transakcjami i uwierzcie mi już mi ręce opadają. Przeczytałem kilkadziesiąt artykułów o tym jak łatwo się robi transakcje w MySQL że mnie głowa boli, a teraz do meritum:

Mam stronke w PHP, na tej stronce mam HTML-owe TEXTAREA w ktorym wpisuje zapytanie SQL, po kliknięciu przycisku "Wykonaj" zapytanie jest wysyłane do bazy i wszystko śmiga tylko że zawsze jest Autocommit :/ , wpisywałem w pliki my.ini oraz w my.cnf , init_connect='set autocommit=0' i nic, AutoCommit ciagle wlaczony. Przed rozpoczęciem zapytania wpisywałem Set autocommit=0 również bez rezultatów, próbowałem rozpoczynać Start transaction , Begin , i wszystkim co gdziekolwiek znalazlem ale ciagle nic. Zawsze insert lub update jest autocommitowany.
Dla wyjasnienia dodam ze oczywiscie probuje to robic na InnoDB, uzytkownikiem ktory nie ma super uprawnien ( gdzies przeczytalem ze na super priviliges nie dziala wylanczanie autocommita ?! )

Pomocy exclamation.gif smile.gif
Mchl
Pokaż kod.
PiotrPietak
if(isset($zapytanie)){

$unslashquery = @stripcslashes($zapytanie);
$zapytanie=$unslashquery;

?>

<body bgcolor="white" onload="thisForm=document.frmKey;">
<form method="POST" action="view.php?id="<?$cm->id?> id="frmTest" name="frmKey">
<table cellpadding="10px">
<tr align="center">
<td align="center" colspan="2">Enter SQL</td>
</tr>
<tr align="center">
<td>
<textarea name="entry" style="width:60%" rows="15"><?echo $stxt; ?></textarea>
</td>
<tr align="center">
<td>
<input type="button" onclick="executeSelectedText(thisForm.entry)" value="Execute 1" />
</td>
</tr>
</table>
</form>

<?



// polaczenie z baza danych usera
$A=test;
$B=test;
$C=test1;
$D=localhost;
connect_to_database_dcl($D,$A,$B,$C,$con2);

$wynik = mysql_query($zapytanie);

result_from_database_dcl($wynik,$zapytanie);


}
darko
to jeszcze zdradź nam kod connect_to_database_dcl i result_from_database_dcl
PiotrPietak
function connect_to_database_dcl($dbhost,$dbuser,$dbpass,$dbname,$con){


$con = @mysql_connect($dbhost, $dbuser, $dbpass)

$coding = @mysql_client_encoding($link);
@mysql_query('SET NAMES utf8');
$db = @mysql_select_db($dbname, $con)

}


function result_from_database_dcl($wynik,$zapytanie){


echo "<table border=\"1\" width=\"60%\" cellpadding=\"7px\" align=\"center\"><tr align=\"center\"><td>".get_string("result", "dcl")."</td></tr>";
echo "<tr align=\"center\">";
echo "<td>";


if(mysql_num_rows($wynik) > 0) {

echo "<table cellpadding=\"2\" border=1 align=\"center\">";
echo "<tr bgcolor=#333366>";

$i = 0;
while ($i < mysql_num_fields($wynik))
{
$meta = mysql_fetch_field($wynik);
echo "<td><b><span style=\"color: #ffffff\">".$meta->name."</span></b></td> \n";
$i++;
};
echo "</tr>";

while($r = mysql_fetch_array($wynik))
{
echo "<tr>";
for ($i=0; $i < mysql_num_fields ($wynik); $i++) {
echo "<td >".$r[$i]."</td>";
}
echo "</tr>";

};
echo "</table>";
};
echo "</td></tr></table>";



}


Sorry Zapomnialem smile.gif Tylko ze teraz tak patrze ze za kazdym razem jak wysylam zapytanie to odpalane jest Connect_to_database_dcl czyli jest na nowo polaczenie robione, to moze byc problem ? w MySQL i PHP siedze od 2 miesiecy takze musicie mi wybaczyc troche smile.gif
darko
Nigdzie nie korzystasz z transakcji, poczytaj tu, osobiście polecam PDO i zobacz np. tu I nie łącz się z każdym zapytaniem na nowo z bazą
PiotrPietak
Tzn z transakcji chce korzystać poprzez wpisanie w HTML TEXTAREA np: start transaction kliknac ->execute->wpisac insert into -> execute -> rollback ->execute

a jak nie robic polaczenia za kazdym razem skoro mam kilka polaczen do roznych baz danych w tym samym pliku php zaleznie co klikne ? w mysql_query nie mam miejsca do wpisania nazwy polaczenia z ktorego ma kozystac :/

Mchl
Cytat(PiotrPietak @ 19.12.2009, 13:17:43 ) *
Tylko ze teraz tak patrze ze za kazdym razem jak wysylam zapytanie to odpalane jest Connect_to_database_dcl czyli jest na nowo polaczenie robione, to moze byc problem ?


Zdecydowanie. Transakcja obejmuje tylko jedno połączenie. Inna sprawa, że jeżeli rozpocząłeś transakcję przez BEGIN a potem nie zrobiłeś COMMIT ani implicit commit, to transakcja powinna być automatycznie zrollowana po zakończeniu połączenia.
PiotrPietak
To jak w takim razie uniknac tworzenia ciagle nowego polaczenia skoro tak jak pisalem mam kilka roznych polaczen ? jest jakas mozliwosc oznaczenia ze mysql_query ma kozystac z jakiegos konkretnego z nich ?
Mchl
Czekaj, czekaj... ty taki jakby interfejs do MySQL robisz...


Moim zdaniem nie bardzo.
Możesz pobawić się z persistent connections, ale jeśli dobrze pamiętam i tak za każdym razem otwierana jest nowa sesja, więc transakcji nie utrzymasz.

Mój pomysł: Wpisuj po kilka zapytan naraz, rozbijaj łańcuch na ; i wykonuj w pętli wszystkie zapytania.
Od razu problem: ; może wystąpić nie tylko na końcu zapytania.
PiotrPietak
Nie dobrze , nie to chcialem uslyszec :/ Probowalem juz wysylac zapytanie "start transaction; Insert into trans value (null,'e','5');" ale wywala mi bład, z petlami nie probowalem, jak sie uda to dam znac chodz jeszcze nie wiem jak to zrobic :/
Mchl
Zamiast ext\mysql możesz użyć ext\mysqli, który ma możliwość wysłania kilku zapytań na raz.
http://php.net/manual/en/mysqli.multi-query.php
PiotrPietak
Cytat(Mchl @ 19.12.2009, 13:54:36 ) *
Możesz pobawić się z persistent connections, ale jeśli dobrze pamiętam i tak za każdym razem otwierana jest nowa sesja, więc transakcji nie utrzymasz.



Jestes mistrzem smile.gif Persistant Connection zadziałało exclamation.gif smile.gif Dzieki wielkie za pomoc
Mchl
Uważaj tylko, bo te połączenia potrafią zachowywać się dosyć nieprzywidywalnie.
PiotrPietak
a wiesz cos dokladniej na temat ich zachowania ? bo w necie malo o tym wogole jest i malo przykladow (przynajmniej ja nie trafilem )
Mchl
Na przykład jeśli masz kilku użytkowników korzystających naraz z Twojej aplikacji, to jeżeli serwer www nie jest prawidłowo skonfigurowany, mogą im się mieszać połączenia (nie pytaj co to znaczy 'prawidłowo skonfigurowany', wiem tyle co Ty).
Inny objaw, to połączenia, które nie chcą się zamknąć i zapychają pulę dozwolonych połączeń.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.