![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 415 Pomógł: 46 Dołączył: 26.05.2007 Skąd: Sandomierz Ostrzeżenie: (0%) ![]() ![]() |
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ś =)Czy istnieje funkcja w PHP, która pozwala zablokować modyfikowany rekord? Co przez to rozumiesz? (ale raczej nie ma)
-------------------- Grzegorz 'Decha' Polek »
º http://grzegorzpolek.com º http://www.facebook.com/grzegorz.polek º http://www.lastfm.pl/user/Dechaa ![]() |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował grzehotnik 5.02.2009, 19:51:59 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 27.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował ddiceman 6.02.2009, 16:40:55 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 27.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
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). |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
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) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:54 |