Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Transakcje
grzehotnik
post 20.02.2009, 20:26:16
Post #1





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 8.01.2009

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


Chcę wykonać zapytanie do bazy i utworzyć katalog.
Chcę żeby wykonały się oba polecenia albo żadne.
Myślałem o transakcjach, ale nigdy z nich nie korzystałem.
Czy mogłby ktoś napisać w jaki sposób one działają, albo znacie może inne przykład?
Go to the top of the page
+Quote Post
Rafal Filipek
post 20.02.2009, 22:54:56
Post #2





Grupa: Zarejestrowani
Postów: 274
Pomógł: 54
Dołączył: 2.05.2006
Skąd: Nadarzyn

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


Kod
$query = 'twoje zapytanie';
if(mysql_query($query)) mkdir('katalog');

katalog doda sie tylko jezeli mysql_query nie zwróci false.

Ten post edytował Rafal Filipek 20.02.2009, 22:55:08
Go to the top of the page
+Quote Post
legorek
post 20.02.2009, 23:06:20
Post #3





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


No tak tylko, co w przypadku gdy katalog nie zostanie stworzony? Zapytanie już zostało wykonane, a nie powinno. Tego się nie da zrobić w prosty sposób.


--------------------
Go to the top of the page
+Quote Post
Rafal Filipek
post 20.02.2009, 23:19:35
Post #4





Grupa: Zarejestrowani
Postów: 274
Pomógł: 54
Dołączył: 2.05.2006
Skąd: Nadarzyn

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


no tak troche sie pospieszyłem ale nadal nie jest to problem smile.gif
Kod
$query = 'zapytanie';
if(mkdir('katalog')){
  if(!mysql_query($query)){
    rmdir('katalog');
  }
}


Ten post edytował Rafal Filipek 20.02.2009, 23:20:11
Go to the top of the page
+Quote Post
grzehotnik
post 20.02.2009, 23:23:55
Post #5





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 8.01.2009

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


Włąśnie o to mi chodziło
Dziękuje bardzo
<piwo>
Go to the top of the page
+Quote Post
legorek
post 20.02.2009, 23:36:20
Post #6





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Ale to ciągle nie jest atomowa operacja.

Przeanalizujemy taką sytuację:
1)Folder jest tworzony
2)Zapytanie się nie udało (bo np jest chwilowo za bardzo obciążona maszyna)
3)Skoro jest obciążona to jest bardzo prawdopodobne, że nie będzie się dało też skasować folderu

Folder pozostaje choć nie powinno go być, bo zapytanie było nieudane.

Jeszcze raz powtórzę: to nie jest takie proste.


--------------------
Go to the top of the page
+Quote Post
grzehotnik
post 20.02.2009, 23:48:14
Post #7





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 8.01.2009

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


Niestety nie działa to ponieważ gdy nie uda się stworzyć katalogu (np. istnieje juz taki o podanej nazwie)
To w bazie danych rekord się zapisze.

Słyszałem o transakcjach w mysql to znaczy że pisze się w bloku kilka operacji i mysql albo wykona wszystkie albo nie wykona żadnej.
Ale niestety ie wiem czy jest coś takiego w php.
Go to the top of the page
+Quote Post
Rafal Filipek
post 21.02.2009, 00:03:01
Post #8





Grupa: Zarejestrowani
Postów: 274
Pomógł: 54
Dołączył: 2.05.2006
Skąd: Nadarzyn

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


Cytat
Niestety nie działa to ponieważ gdy nie uda się stworzyć katalogu (np. istnieje juz taki o podanej nazwie)
To w bazie danych rekord się zapisze.

kod ktory podalem nie doda rekordu jezeli nie stworzy katalogu. mozesz sobie ewentualnie dodac jeszcze w pierwzym if sprawdzenie czy katalog istnieje zanim go stworzysz. naturalnie to co pisze legorek zgadza sie dlatego napisz nam te jakie moga byc przyczyny niepowodzenia ?
Go to the top of the page
+Quote Post
230005
post 21.02.2009, 00:21:28
Post #9





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Ten post Rafała Filipka prawdę ci powie. Kod jest dobry. Tylko nie zapomnij na samym początku - w sensie przed wykonaniem zapytań - wyłączyć autocommit:

Kod
$uchwyt_polaczenia_z_baza -> autocommit(false);

//a później

$uchwyt_polaczenia_z_baza -> autocommit(true);


Cytat
Słyszałem o transakcjach w mysql to znaczy że pisze się w bloku kilka operacji i mysql albo wykona wszystkie albo nie wykona żadnej.


I właśnie po to jest ten autocommit :] .
Go to the top of the page
+Quote Post
Rafal Filipek
post 21.02.2009, 00:37:18
Post #10





Grupa: Zarejestrowani
Postów: 274
Pomógł: 54
Dołączył: 2.05.2006
Skąd: Nadarzyn

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


@230005 zapomniales chyba dodac ze to o czym piszesz i ten autocomit to tyczy sie przypadku gdy korzystamy z mysqli ajest to dosc istotna roznica.
Go to the top of the page
+Quote Post
230005
post 21.02.2009, 00:44:28
Post #11





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Fakt, mój błąd :/
Go to the top of the page
+Quote Post
mls
post 21.02.2009, 10:52:29
Post #12





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


Transakcje są w MySQL, ale nie działają na tabelach MyISAM (więc trzeba sobie w razie konieczności skonwertować np. na InnoDB).
Przykładowa transakcja w pseudokodzie:
Kod
query('START TRANSACTION');
try
{
    // tu zapytania SQL
}
exception
{
    // tu akcje do wykonania, jeśli co najmniej jedno z zapytań SQL się nie powiedzie
    query('ROLLBACK');
    return; // lub break
}
// tu akcje do wykonania, jeśli wszystkie zapytania się powiodą
query('COMMIT');


Oczywiście wymagana jest klasa dostępu do MySQLa zwracająca błędy jako wyjątki.

Ten post edytował mls 21.02.2009, 10:52:45


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.02.2009, 11:32:23
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


MySQL obsługuje transakcje, ale czy Twój system plików też?

PS. Dlaczego, katalog miałby się nie tworzyć?
Go to the top of the page
+Quote Post
dr_bonzo
post 21.02.2009, 11:57:36
Post #14





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


A moze kolega nie potrzebuje az tak idealnych transakcji?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
grzehotnik
post 22.02.2009, 12:01:18
Post #15





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 8.01.2009

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


Cytat
$query = 'zapytanie';
if(mkdir('katalog')){
if(!mysql_query($query)){
rmdir('katalog');
}
}


Wykorzystałem ten kod, dodałem tylko sprawdzenie czy katalog już istnieje, bo wcześniej jak już istniał to miałem błąd.
I wszystko ok.
Dzięki
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: 14.08.2025 - 02:46