Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Transakcje
Forum PHP.pl > Forum > PHP
grzehotnik
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?
Rafal Filipek
Kod
$query = 'twoje zapytanie';
if(mysql_query($query)) mkdir('katalog');

katalog doda sie tylko jezeli mysql_query nie zwróci false.
legorek
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.
Rafal Filipek
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');
  }
}
grzehotnik
Włąśnie o to mi chodziło
Dziękuje bardzo
<piwo>
legorek
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.
grzehotnik
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.
Rafal Filipek
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 ?
230005
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 :] .
Rafal Filipek
@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.
230005
Fakt, mój błąd :/
mls
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.
Crozin
MySQL obsługuje transakcje, ale czy Twój system plików też?

PS. Dlaczego, katalog miałby się nie tworzyć?
dr_bonzo
A moze kolega nie potrzebuje az tak idealnych transakcji?
grzehotnik
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
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.