Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP a modyfikacje rekordu w mysql
Forum PHP.pl > Forum > PHP
grzehotnik
Witam mam pytanie odnośnie modyfikacji rekordów w mysql za pomocą PHP.
Jeśli robię skrypt, który modyfikuje powiedzmy opis jakiegoś produktu w tabeli
i nadaję prawo do modyfikacji kilku użytkownikom, co się dzieje jeśli dwie lub więcej osób
będą chciały zmodyfikować dokładnie ten sam rekord w dokładnie tym samym czasie?

Czy istnieje funkcja w PHP, która pozwala zablokować modyfikowany rekord?

Jak obejść taką sytuacje?
decha-design
Cytat(grzehotnik @ 5.02.2009, 18:21:01 ) *
co się dzieje jeśli dwie lub więcej osóbbędą chciały zmodyfikować dokładnie ten sam rekord w dokładnie tym samym czasie?
Nic się nie dzieje, modyfikacje zostaną wprowadzone w kolejności, w jakiej zostały wykonane. MySQL sprawdza czas wykonania czynności do jakiejś tam milisekundy chyba czy coś, a raczej nie zdarza się aby zgadzała się sekunda, a nawet jeśli to z milisekundami już byłoby trudniej. A nawet jeśli, ale to duże jeśli, by taka sytuacja nastąpiła, to raczej jakoś sobie z tym poradzi, losowo albo coś =)

Cytat(grzehotnik @ 5.02.2009, 18:21:01 ) *
Czy istnieje funkcja w PHP, która pozwala zablokować modyfikowany rekord?
Co przez to rozumiesz? (ale raczej nie ma)
grzehotnik
Cytat
Czy istnieje funkcja w PHP, która pozwala zablokować modyfikowany rekord?


W pracy mam baze oracle i do obsługi jest wykorzstywana java.
Podczas zapisu do bazy za pomocą jakiejś funkcji(nie pamiętam nazwy) blokuje dany rekord,
a po zapisie odblokowuje go.
Pytanie moje po części dotyczyło tego czy php (a może mysql) posiada funkcję do blokowania rekordów.
Ramadisu
Wedle mojej wiedzy - nie ma takiej możliwości. Jedyne co przychodzi mi na myśl, to dodatkowa kolumna w bazie 'blocked'. W przypadku edycji danego wiersza mysql_query('UPDATE `table` SET `blocked` = '1') - co dalej z tym zrobić to już się jak mam nadzieję domyślasz.
ddiceman
Ramadisu - mylisz sie. Instrukcja UPDATE w MySQL jest operacja atomowa - do czasu jej zakonczenia blokowana jest tabela (jezeli silnik MyISAM) lub korygowany wiersz (silnik InnoDB). A zatem operacje Update wykonaja sie sekwencyjnie - jedna po drugiej, w porzadku zapisanym w kolejce zapytan (czas nadejscia). Blokada odbywa sie automatycznie
Dodatkowo blokade mozna wymusic za pomoca LOCK i UNLOCK TABLE
Ramadisu
Cytat(ddiceman @ 6.02.2009, 16:39:25 ) *
Ramadisu - mylisz sie. Instrukcja UPDATE w MySQL jest operacja atomowa - do czasu jej zakonczenia blokowana jest tabela (jezeli silnik MyISAM) lub korygowany wiersz (silnik InnoDB). A zatem operacje Update wykonaja sie sekwencyjnie - jedna po drugiej, w porzadku zapisanym w kolejce zapytan (czas nadejscia). Blokada odbywa sie automatycznie
Dodatkowo blokade mozna wymusic za pomoca LOCK i UNLOCK TABLE


Cóż, to akurat jest oczywiste że zapytania pójdą wg. kolejki, wydaje mi się jednak że grzehotnikowi chodzi o sytuację kiedy np. dwóch administratorów otwiera w panelu opcję 'edytuj użytkownika' i edytuje tego samego użytkownika. Najpierw otwiera pierwszy, po chwili drugi - oboje mają te same dane w przykładowym formie uzupełnianym danymi z query. Następnie jeden z nich kilka wyślij i uznaje że rekord został zapisany tak jak on tego chciał - rzeczywiście tak jest. Natomiast drugi administrator nie mając pojęcia że ktoś aktualnie pracuje na tej części danych kilka sekund/minut później nadpisuje jego pracę, nawet jeżeli ten pierwszy powiedzmy zmieniał maila użytkownika, a drugi jego podpis (obrazowo przedstawione).
ddiceman
Jezeli jest tak, jak mowisz, to oczywiscie masz racje. Z drugiej zas strony na podstawie
Cytat
zmodyfikować dokładnie ten sam rekord w dokładnie tym samym czasie

oraz
Cytat
Podczas zapisu do bazy za pomocą jakiejś funkcji(nie pamiętam nazwy) blokuje dany rekord,
a po zapisie odblokowuje go.

wnioskuje, ze jednak chodzilo o blokowanie danych, tak by naraz tylko jeden proces mogl zmodyfikowac wierz/tabele co nie jest oczywistoscia. Fakt, ze zapytania przychodza kolejno nie implukuje tego, ze jedno jest wykonywane nim skonczy sie drugie - sytuacje taka mozesz zobaczyc, gdy nie zalozysz na otwarty plik (fopen()) blokady do zapisu (flock()) i sprobujesz zapisywac do pliku jednoczesnie, nieco dluzszy ciag znakow, ale o roznej dlugosci. Najprawdopodobniej wtedy plik ulegnie uszkodzeniu bowiem system plikow standardowo nie traktuje operacji zapisu jako atomowej i mysle, to wlasnie o to bylo pytanie. MySQL zapewnia spojnosc danych tylko dlatego, ze wlasnie naklada blokady na wiersz/tabele (nie zas dlatego, ze kolejkuje zapytania)
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.