Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> MySQL (Autocommit + transakcje) + PHP = Boom
PiotrPietak
post 19.12.2009, 12:36:48
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 12:47:02
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Pokaż kod.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 12:59:31
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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);


}
Go to the top of the page
+Quote Post
darko
post 19.12.2009, 13:09:51
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


to jeszcze zdradź nam kod connect_to_database_dcl i result_from_database_dcl


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 13:17:43
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
darko
post 19.12.2009, 13:26:06
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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ą

Ten post edytował darko 19.12.2009, 13:27:35


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 13:32:18
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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 :/

Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 13:45:38
Post #8





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 13:49:27
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 13:54:36
Post #10





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 14:07:54
Post #11





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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 :/
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 14:39:51
Post #12





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 14:42:27
Post #13





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 14:56:35
Post #14





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Uważaj tylko, bo te połączenia potrafią zachowywać się dosyć nieprzywidywalnie.
Go to the top of the page
+Quote Post
PiotrPietak
post 19.12.2009, 15:24:48
Post #15





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 19.12.2009

Ostrzeżenie: (0%)
-----


a wiesz cos dokladniej na temat ich zachowania ? bo w necie malo o tym wogole jest i malo przykladow (przynajmniej ja nie trafilem )
Go to the top of the page
+Quote Post
Mchl
post 19.12.2009, 16:22:49
Post #16





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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ń.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 21:18