[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
=?ISO-8859-2?Q?Pawe=B3?= - 22-07-2007 00:03
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
Witam
Jak zabezpieczyć się przed jednoczesną edycją bazy (tego samego rekordu) przez dwie osoby (A i B) jednocześnie ?
Wygląda to tak: A klika na www: "edytuj zamówienie" (rekord o jakimś nr) - PHP przypisuje do bazy (do tabeli użytkownicy - w rekordzie dotyczącym A - w kolumnie "numer bieżącego zamówienia edytowanego teraz przez tego użytkownika") numer tego klikniętego zamówienia który A chce edytować.
Najpierw PHP sprawdza jednak czy przypadkiem B (albo ktoś jeszcze inny) nie zaczął już edytować tego zamówienia (tego rekordu o takim samym numerze, który chce edytować A)
Działa to tak: 1) PHP (A) sprawdza czy ktoś inny nie edytuje już tego numeru 2) jeśli nie to przypisuje numer osobie (A), która akurat chce edytować ten nr (rekord - zamówienie). 3) jeśli ten sam rekord za chwilę będzie chciał edytować B - "jego" skrypt stwierdzi, że ten rekord jest już "zajęty" przez kogoś innego i nie pozwoli na jego edycję przez B.
Problem pojawi się w momencie (z pkt-u widzenia A) pomiędzy 1) i 2), kiedy skrypt uruchomi też inna osoba np. B i "jego" skrypt wpisze (pkt. 1), że ten nr jest zajęty (skrypt uruch. przez A nie zdążył jeszcze "zająć" tego n-ru), jednak skrypt osoby A już tego nie zauważy - bo sprawdził to już w pkt. 1) - wtedy ten nr jeszcze był wolny.
I z punktu osoby B - skrypt przez nią uruchomiony nie stwierdzi, że dany nr jest zajęty (w momencie pomiędzy 1) i 2), z pkt-u widzenia A), bo skrypt uruch. przez A "zajmie" ten nr dopiero w pkt. 2).
Jak zapobiec takiej "podwójnej" edycji tego samego rekordu ?
Dziękuję. Paweł
=?ISO-8859-2?Q?Przemys=B3aw_Rachwa=B3?= - 22-07-2007 00:03
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Paweł napisał(a): > Witam > > Jak zabezpieczyć się przed jednoczesną edycją bazy (tego samego rekordu) > przez dwie osoby (A i B) jednocześnie ? > > Wygląda to tak: > A klika na www: "edytuj zamówienie" (rekord o jakimś nr) - PHP > przypisuje do bazy > (do tabeli użytkownicy - w rekordzie dotyczącym A - w kolumnie "numer > bieżącego zamówienia edytowanego teraz przez tego użytkownika") > numer tego klikniętego zamówienia który A chce edytować. > > Najpierw PHP sprawdza jednak czy przypadkiem B (albo ktoś jeszcze inny) > nie zaczął już edytować tego zamówienia (tego rekordu o takim samym > numerze, który chce edytować A) > > Działa to tak: > 1) PHP (A) sprawdza czy ktoś inny nie edytuje już tego numeru > 2) jeśli nie to przypisuje numer osobie (A), która akurat chce edytować > ten nr (rekord - zamówienie). > 3) jeśli ten sam rekord za chwilę będzie chciał edytować B - "jego" > skrypt stwierdzi, że ten rekord jest już "zajęty" przez kogoś innego i > nie pozwoli na jego edycję przez B. > > Problem pojawi się w momencie (z pkt-u widzenia A) pomiędzy 1) i 2), > kiedy skrypt uruchomi też inna osoba np. B i "jego" skrypt wpisze (pkt. > 1), że ten nr jest zajęty (skrypt uruch. przez A nie zdążył jeszcze > "zająć" tego n-ru), jednak skrypt osoby A już tego nie zauważy - bo > sprawdził to już w pkt. 1) - wtedy ten nr jeszcze był wolny. > > I z punktu osoby B - skrypt przez nią uruchomiony nie stwierdzi, że dany > nr jest zajęty (w momencie pomiędzy 1) i 2), z pkt-u widzenia A), bo > skrypt uruch. przez A "zajmie" ten nr dopiero w pkt. 2). > > Jak zapobiec takiej "podwójnej" edycji tego samego rekordu ? > > Dziękuję. Paweł
ze względu na późną porę napiszę krótko: Transakcja o ile twoja baza wspiera coś takiego, tudzież blokowanie rekordu i przy próbie wykonania UPDATE otrzymasz komunikat że zablokowane
=?ISO-8859-2?Q?Pawe=B3?= - 23-07-2007 00:02
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Przemysław Rachwał napisał(a):
> ze względu na późną porę napiszę krótko: Transakcja o ile twoja baza > wspiera coś takiego, tudzież blokowanie rekordu i przy próbie wykonania > UPDATE otrzymasz komunikat że zablokowane
Dziękuję za odpowiedź.
Chodzi mi o MySQL 4.0 albo 4.1
Ale co jeśli: 1) "A" sprawdza czy rekord jest wolny ? - jest 2) podejmuje stosowne działanie w związku z tym
Ale okazało się, że pomiędzy 1) i 2) władował się B i w tym właśnie momencie (między 1) i 2)) zablokował ?
Jak temu zapobiec, bo 4.0-4.1 chyba nie obsługuje transakcji ?
Przemyslaw Popielarski - 23-07-2007 00:23
=?iso-8859-2?Q?Re:_=5BMySQL_4.0...4.1=5D_zabezpieczenie_przed _jednoczes?==?iso-8859-2?Q?n=B1_edycj=B1?=
Paweł wrote: > > Jak temu zapobiec, bo 4.0-4.1 chyba nie obsługuje transakcji ?
Chyba obsluguje.
-- ../ premax ../ premax@hot.pl ../ koniec i bomba, a kto czytal ten traba. w.g.
=?ISO-8859-2?Q?Artur_Muszy=F1ski?= - 24-07-2007 00:12
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Paweł pisze: > Witam > > Jak zabezpieczyć się przed jednoczesną edycją bazy (tego samego rekordu) > przez dwie osoby (A i B) jednocześnie ? > > Wygląda to tak: > A klika na www: "edytuj zamówienie" (rekord o jakimś nr) - PHP > przypisuje do bazy > (do tabeli użytkownicy - w rekordzie dotyczącym A - w kolumnie "numer > bieżącego zamówienia edytowanego teraz przez tego użytkownika") > numer tego klikniętego zamówienia który A chce edytować. > > Najpierw PHP sprawdza jednak czy przypadkiem B (albo ktoś jeszcze inny) > nie zaczął już edytować tego zamówienia (tego rekordu o takim samym > numerze, który chce edytować A) > > Działa to tak: > 1) PHP (A) sprawdza czy ktoś inny nie edytuje już tego numeru > 2) jeśli nie to przypisuje numer osobie (A), która akurat chce edytować > ten nr (rekord - zamówienie). > 3) jeśli ten sam rekord za chwilę będzie chciał edytować B - "jego" > skrypt stwierdzi, że ten rekord jest już "zajęty" przez kogoś innego i > nie pozwoli na jego edycję przez B. > > Problem pojawi się w momencie (z pkt-u widzenia A) pomiędzy 1) i 2), > kiedy skrypt uruchomi też inna osoba np. B i "jego" skrypt wpisze (pkt. > 1), że ten nr jest zajęty (skrypt uruch. przez A nie zdążył jeszcze > "zająć" tego n-ru), jednak skrypt osoby A już tego nie zauważy - bo > sprawdził to już w pkt. 1) - wtedy ten nr jeszcze był wolny. > > I z punktu osoby B - skrypt przez nią uruchomiony nie stwierdzi, że dany > nr jest zajęty (w momencie pomiędzy 1) i 2), z pkt-u widzenia A), bo > skrypt uruch. przez A "zajmie" ten nr dopiero w pkt. 2). > > Jak zapobiec takiej "podwójnej" edycji tego samego rekordu ? > > Dziękuję. Paweł
Tak na oko da się to zrobić nawet bez transakcji: UPDATE zam SET edytowany_przez=434 WHERE id=3554 AND edytowany_przez IS NULL i teraz sprawdzasz affected rows, jeśli 0 to znaczy że jest edytowany przez kogoś innego
artur
=?ISO-8859-2?Q?Pawe=B3?= - 24-07-2007 00:12
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Przemyslaw Popielarski napisał(a): > Paweł wrote: >> >> Jak temu zapobiec, bo 4.0-4.1 chyba nie obsługuje transakcji ? > > Chyba obsluguje. >
A co zrobić żeby moje zapytania były objęte transakcją ? Bo domyślnie chyba nie są ?
=?ISO-8859-2?Q?Pawe=B3?= - 24-07-2007 00:12
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
> Tak na oko da się to zrobić nawet bez transakcji: > UPDATE zam SET edytowany_przez=434 > WHERE id=3554 AND edytowany_przez IS NULL > i teraz sprawdzasz affected rows, jeśli 0 to znaczy że jest edytowany > przez kogoś innego > > artur
Nie rozumiem. Jak sprawdzić affected rows i co to jest ?
Przemyslaw Popielarski - 24-07-2007 00:12
=?iso-8859-2?Q?Re:_=5BMySQL_4.0...4.1=5D_zabezpieczenie_przed _jednoczes?==?iso-8859-2?Q?n=B1_edycj=B1?=
Paweł wrote: >>> Jak temu zapobiec, bo 4.0-4.1 chyba nie obsługuje transakcji ? >> >> Chyba obsluguje. > > A co zrobić żeby moje zapytania były objęte transakcją ?
Zaczac transakcje.
> Bo domyślnie chyba nie są ?
Zalezy od konfiguracji.
Polecam instrukcje obslugi do MySQL.
-- ../ premax ../ premax@hot.pl ../ koniec i bomba, a kto czytal ten traba. w.g.
Przemyslaw Popielarski - 24-07-2007 00:12
=?iso-8859-2?Q?Re:_=5BMySQL_4.0...4.1=5D_zabezpieczenie_przed _jednoczes?==?iso-8859-2?Q?n=B1_edycj=B1?=
Paweł wrote: > Jak sprawdzić affected rows i co to jest ?
To jest nazwa funkcji, uzywasz php, to zajrzyj do instrukcji php.
-- ../ premax ../ premax@hot.pl ../ koniec i bomba, a kto czytal ten traba. w.g.
=?ISO-8859-2?Q?Pawe=B3?= - 24-07-2007 00:12
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Przemyslaw Popielarski napisał(a): > Paweł wrote: >> Jak sprawdzić affected rows i co to jest ? > > To jest nazwa funkcji, uzywasz php, to zajrzyj do instrukcji php. >
Dzięki, dobry pomysł z tym affected rows.
=?ISO-8859-2?Q?Pawe=B3?= - 24-07-2007 00:12
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Przemyslaw Popielarski napisał(a): > Paweł wrote: >>>> Jak temu zapobiec, bo 4.0-4.1 chyba nie obsługuje transakcji ? >>> >>> Chyba obsluguje. >> >> A co zrobić żeby moje zapytania były objęte transakcją ? > > Zaczac transakcje. > >> Bo domyślnie chyba nie są ? > > Zalezy od konfiguracji. > > > Polecam instrukcje obslugi do MySQL.
Nie lubię instrukcji do MySQL, działa mi na nerwy. Do PHP instrukcja jest znacznie lepsza.
Przemyslaw Popielarski - 24-07-2007 00:12
=?iso-8859-2?Q?Re:_=5BMySQL_4.0...4.1=5D_zabezpieczenie_przed _jednoczes?==?iso-8859-2?Q?n=B1_edycj=B1?=
Paweł wrote: > Nie lubię instrukcji do MySQL, działa mi na nerwy. > Do PHP instrukcja jest znacznie lepsza.
Jak dla mnie to są porównywalne.
-- ../ premax ../ premax@hot.pl ../ koniec i bomba, a kto czytal ten traba. w.g.
=?ISO-8859-2?Q?Pawe=B3?= - 24-07-2007 00:13
=?ISO-8859-2?Q?Re=3A_=5BMySQL_4=2E0=2E=2E=2E4=2E1=5D_zabez?== ?ISO-8859-2?Q?pieczenie_przed_jednoczesn=B1_edycj=B1?=
Przemyslaw Popielarski napisał(a): > Paweł wrote: >> Nie lubię instrukcji do MySQL, działa mi na nerwy. >> Do PHP instrukcja jest znacznie lepsza. > > Jak dla mnie to są porównywalne. >
W instrukcji MySQL jest dużo haseł gdzieś ukrytych w treści i później muszę ich szukać przez ctrl+f (mam na myśli format HTML Help).
Np. Chapter 13. SQL Statement Syntax Do jednego worka zostało wrzuconych tak wiele rzeczy (duża objętość).
W PHP np. wpisuje strpos i od razu w wynikach wyszukiwania widzę: "strpos" - mam wszystko co potrzebuję plus dodatkowo linki na dole do pokrewnych haseł.
W MySQL wpisuję np. "affected" i dostaję kilkadziesiąt wyników - nigdzie w nazwie nie widzę tego słowa - muszę wchodzić wszędzie i szukać tego słowa przez ctrl+f - zniechęca mnie to.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Gdzie MySQL 4.1, a gdzie 5.0?
[MS SQL] "set names" (mySQL) w MS SQL
oracle -> oracle lub oracle -> mysql replikacja - programy
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
[MySQL] Zwrot tego, co pasuje i nie pasuje :-/
[pgsql] Dostosowanie składni MySQL 5.0 -> PGSQL 8.1
[mysql] galeria zdjec - numerowanie zdjec
[MySQL] Zapytanie z pliku , wynik do pliku
[mysql] CONCAT agregujący, ale nie GROUP_CONCAT()
mysql data 0000-00-00 na koniec
zanotowane.pldoc.pisz.plpdf.pisz.pltejsza.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|