![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Mam pytanko jak zrobic selecta, i przy edycji zeby inny user nie mogl wejsc na ten sam rekord w tym czasie
(blokada przed jednoczesna edycja przez dwie osoby) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
transakcje ...
poczytaj w manualach ( w zależności od bazy danych ) o 'BEGIN', 'START TRANSACTION', 'COMMIT', 'ROLLBACK', 'LOCK'. W adodb ( o ile używasz ) poczytaj o 'StartTrans', 'CompleteTrans'. Oprócz tego są jeszcze fajne artykuły na ten temat np. na phpbuilder.com To wszystko co mogę Ci w tej chwili doradzić |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 680 Pomógł: 0 Dołączył: 1.10.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat Mam pytanko jak zrobic selecta, i przy edycji zeby inny user nie mogl wejsc na ten sam rekord w tym czasie
To jest niemożliwe... Jeśli ktoś pracuje na danym rekordzie dostęp do niego jest blokowany. W bazach danych wykorzystywany jest mechanizm kolejkowania. PS. Jabol, tranzakcja to zupełnie inna sprawa. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
A jak sprawdzić czy rekord jest zablokowany przez inna osobe
|
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
nie da sie. jezeli jest zablokowona to baza poczeka az sie odblokuje. mozesz zrobic wlasny system semaforow, jezeli chcesz to koniecznie wiedziec.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 680 Pomógł: 0 Dołączył: 1.10.2002 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat A jak sprawdzić czy rekord jest zablokowany przez inna osobe
A po co? Przecież to się odbywa w takim tempie, że nie warto tego sprawdzać... |
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat A jak sprawdzić czy rekord jest zablokowany przez inna osobe
A po co? Przecież to się odbywa w takim tempie, że nie warto tego sprawdzać... |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
mysle ze sie da.
bynajmniej w Oracle sie da. a po to ze jak osoba edytuje np 10 min to inna nie moze wejsc w tym czasie i zacząć edytować |
|
|
![]()
Post
#9
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
8O 8O 10min !!! ? po co tyle czasu ? Chyba, nie edytujesz plikow bazy recznie ?
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 8O 8O 10min !!! ? po co tyle czasu ? Chyba, nie edytujesz plikow bazy recznie ?
wyobraz sobie sytuacje ktos wchodzi na rekord i zaczyna go edytować ale w miedzyczasie wychodzi na kawę, (zostawia tak rekord bez commita) i w miedzyczasie ktos inny chce przeedytować ten rekord i ona juz nie powinna tego zrobic |
|
|
![]()
Post
#11
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
jezeli zostawia bez commita to nic się nie stanie bo jest podczas transakcji. Pozatym zawsze jest LOCK TABLE i po sprawie ( jeżeli jeszcze nie zaczął ).
ps. taki sposób pracy z bazą danych jest bardzo niewydajny. W końcu od czego są te wszystkie klienty do baz ? |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat a po to ze jak osoba edytuje np 10 min to inna nie moze wejsc w tym czasie i zacząć edytować
Ja bym tego nie polecał zwłaszcza w aplikacjach WWW. Co jak edytującemu wysypie się przeglądarka, albo tak jak pisałeś pójdzie na kawę? Nikt nie może przedytować tego rekordu aż do wygaśnięcia sesji. Ja bym się wkurzył gdybym dostał komunikat, że wiersz jest zablokowany przez kogoś, kto zapomniał o tym że miał zapisać zmiany i poszedł do domu. :wink: Można to zrobić dodając do tej tabeli pole edited w której umieszaczne by było id usera który edytuje wiersz (albo NULL gdy nie jest edytowany). Pobranie do edycji wyglądało by tak: [sql:1:54457986be]update tabela set edited='uid' where edited is null and id='costam' [/sql:1:54457986be]Po tym zapytaniu, jeśli ilość zmodyfikowanych wierszy (DBMS powinien zwracać takie coś) jest > 0 wiersz jest traktowany jak zablokowany i przejęty do edycji. Jeśli ta ilośc jest równa 0 to wiersz jest aktualnie edytowany przez kogoś innego. Po zapisie, należałoby go odblokować przez: [sql:1:54457986be]update tabela set edited=null where edited='uid' and id='costam'[/sql:1:54457986be] |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko sie zgadza ale nie moga dwie osoby na raz edytowac jeden rekord
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat a po to ze jak osoba edytuje np 10 min to inna nie moze wejsc w tym czasie i zacząć edytować
Ja bym tego nie polecał zwłaszcza w aplikacjach WWW. Co jak edytującemu wysypie się przeglądarka, albo tak jak pisałeś pójdzie na kawę? Nikt nie może przedytować tego rekordu aż do wygaśnięcia sesji. Ja bym się wkurzył gdybym dostał komunikat, że wiersz jest zablokowany przez kogoś, kto zapomniał o tym że miał zapisać zmiany i poszedł do domu. :wink: Można to zrobić dodając do tej tabeli pole edited w której umieszaczne by było id usera który edytuje wiersz (albo NULL gdy nie jest edytowany). Pobranie do edycji wyglądało by tak: [sql:1:3a117605f2]update tabela set edited='uid' where edited is null and id='costam' [/sql:1:3a117605f2]Po tym zapytaniu, jeśli ilość zmodyfikowanych wierszy (DBMS powinien zwracać takie coś) jest > 0 wiersz jest traktowany jak zablokowany i przejęty do edycji. Jeśli ta ilośc jest równa 0 to wiersz jest aktualnie edytowany przez kogoś innego. Po zapisie, należałoby go odblokować przez: [sql:1:3a117605f2]update tabela set edited=null where edited='uid' and id='costam'[/sql:1:3a117605f2] taki motyw wykorzystywalem do tej pory, ale programuje duzo w Oracle i tan jest to mozliwe do sprawdzenia bez problemu, po prostu sue blokuje rekord i jak inny user chce wejsc i zalokowac dla siebie to mu sie nie udaje, a teraz musze zrobic aplikacje pod Access z baza w Mysql i niestety musze chyba robic z jakims znacznikiem |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat a teraz musze zrobic aplikacje pod Access z baza w Mysql i niestety musze chyba robic z jakims znacznikiem
To użyj zapytania: [sql:1:5fde3040b6]SELECT ... FOR UPDATE[/sql:1:5fde3040b6] w transakcji. To w MySQLu blokuje wiersze tabeli, ale zablokuje Ci również konkurencyjne zapytanie, tzn. nie dostaniesz informacji o tym, że wiersz jest zablokowany tylko DBMS wstrzyma Ci wykonanie drugiego takiego zapytania aż do zakończenia pierwszej transakcji. PS. Pamiętaj też w tym wypadku o robieniu tabel na handlerze InnoDB lub podobnym bo domyślny MyISAM nie wspiera transakcji i blokowania. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 20:27 |