![]() |
![]() |
![]()
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 ![]() ![]() |
|
|
![]() |
![]()
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.
|
|
|
![]()
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); } |
|
|
![]()
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.
|
|
|
![]()
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 ![]() ![]() |
|
|
![]()
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.
|
|
|
![]()
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 :/ |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
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 ?
|
|
|
![]()
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. |
|
|
![]()
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 :/
|
|
|
![]()
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 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 19.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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.
|
|
|
![]()
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 )
|
|
|
![]()
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ń. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 21:18 |