Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Transakcje a PHP.
Forum PHP.pl > Forum > Bazy danych
Black-Berry
Wczoraj odkryłem w MySql mechanizm transakcji. Działa to na prostej zasadzie. Łączy się zapytania w większą grupę którą można zatwierdzić albo cofnąć. Na przykład:

  1. BEGIN;
  2. SELECT * FROM TABLE WHERE id = 10 FOR UPDATE;
  3. UPDATE TABLE SET name = 'moje odkrycie' WHERE id = 10;
  4. COMMIT;

komenda 'FOR UPDATE' sprawia, że tablica 'table' jest zablokowana do odczytu dla innych połaczeń. Obejmując znacznikami BEGIN i COMMIT całą serię selectów i updatów dodających np nowy artykuł mam pewność, że admin i na przykąłd moderator klikając 'zapisz' w tej samej sekundzie nie skrzyżuja danych i nie rozwalą integralności bazy. Jescze trochę o tym czytam ale nie mogę doszukać się odpowiedzi na kilka pytań:

1. Czy dobrze główkuję?
2. Co jeśli moderatorowi braknie prądu? Czy to będzie oznaczało dead lock bo tabela z artykułami nigdy sie nie odblokuje? COMMIT nie nastąpi przecież nigdy.
3. Czy czegoś nie przeoczyłem?
4. Czy to jest tak, ze jesli mam mderatora i administratora i jesli oboje chcą dodać artykuł to czy faktycznie są to odrębne połączenia z bazą?
SongoQ
Tak jestes na dobrej drodze. Z tym ze transakcja obejmuje tylko DML czyli UPDATE INSERT I DELETE. Co do braku pradu to zerwanie polaczenia z baza traktowane jest jako wycofanie transakcji. W przypadku powiedzmy bledu PHP i zamkniecia skryptu podobnie itd. A dead lock to troche inna sytuacja. Transakcje powinno sie zawsze wykorzystywac a szczegolnie tam gdzie wykonujemy bloki operacji ktore musza sie albo na raz wszystkie wykonac albo wycofac.
SirZooro
Ad.1. Tak.
Ad.2. W momencie zerwanie połączenia niezatwierdzone transakcje są wycofywane automatycznie (ROLLBACK).
Ad.3. Raczej nie. Ew. możesz jeszcze zrobić coś takiego że jak wykryjesz błąd w trakcie wysyłania zapytań, to wycofujesz transakcję.
Ad.4. Tak (no chyba że połączenie do bazy będzie ponownie użyte, ale to i tak będą osobne transakcje).
webdice
Proszę zmianę tytułu na taki który opisuje problem, w innym wypadku temat zostanie zamknięty.
Black-Berry
Cytat(SongoQ @ 27.08.2008, 01:14:05 ) *
Tak jestes na dobrej drodze. Z tym ze transakcja obejmuje tylko DML czyli UPDATE INSERT I DELETE.
A co z komendą SELECT (..) FOR UPDATE? Wyczytałem, że jeśli dodam dyrektywę FOR UPDATE to select zostanei objęty tansakcją (zablokowany do odczytu przez inne połączenia). Ma to dla mnie szczególne znaczenie bo jesli dodaje nowy wpis to najpierw sprawdzam liczbę elementów w tablicy zeby nadać mu konkretną kolejnośc. Jeślli inne połaczenie zrobiłoby to samo to miałbym w tym momencie np dwa artykuły o tej samej kolejności. Szkoda że nie można jakąś dyrektywą na czas dodawania wpisu zablokować całej bazy. Miałbym pewność, że czegoś nie przeoczyłem. Blokada nie ma dużego znaczenia dla reszty zapytań bo nowe artykuły dodaje się niezbyt często.

Cytat
4. Czy to jest tak, ze jesli mam mderatora i administratora i jesli oboje chcą dodać artykuł to czy faktycznie są to odrębne połączenia z bazą?

Cytat(SirZooro @ 27.08.2008, 01:17:43 ) *
Ad.4. Tak (no chyba że połączenie do bazy będzie ponownie użyte, ale to i tak będą osobne transakcje).
Przyszło mi do głowy jeszcze jedno... Skoro mam tylko jedną maszynę wykonującą mój skrypt to czy nie oznacza to, że połączenie będzie tylko jedno nawet jeśli moderator i administrator siedzą w innych miastach?
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.