Article View: pl.comp.lang.delphi.bazy-danych
Article #274Re: Blokowanie rekordów
From: Traptak
Date: Sat, 17 Apr 1999 13:33
Date: Sat, 17 Apr 1999 13:33
40 lines
2900 bytes
2900 bytes
Psujak <psujak@friko7.onet.pl> napisał(a) w artykule <ujBR2.1955$O1.27094@news.tpnet.pl>... > Ja tez sie z tym meczylem.Niby Interbase ma cos takiego jak dynamiczne > blokowanie ,ale wlasnie objawia sie to jak powyzej. W tej chwili rozwiazalem > to w ten sposob, ze dodalem sobie pole typu bool (domena locked smallint z > check=0 or 1) i > przed rozpoczeciem edycji sprawdzam, czy pole jest true.Jezeli tak, to > message do usera, zeby poczekal , probowal za chwile. > Jezeli masz na serwerze storedproc ,to tez to musisz uwzglednic. > Jest to uciazliwe w chiwli, jezeli ktos np. zacznie edycje rekordu i pojdzie > np. do kibelka na 30 min. > Mozna tez zrobic sobie view z opcja select * from x where polelocked=1, ale > wtedy tych zablokowanych nie bedzie widac. W InterBase'ie zastosowano metody blokowania optymistycznego. Samo otworzenie transakcji i przejście do edycji jednego z wierszy uzyskanego w wyniku zapytania nie powoduje zablokowania rekordu. A dlaczego? Dlatego, że serwer nie wie, że jest wykonywana edycja rekordu. Wszystkie operacje dzieją się na stacji roboczej, która musi powiadomić serwer o chęci zablokowania rekordu i uzyskać na to jego zgodę lub nie. To co stosuje Psujak to właśnie jest wykorzystanie blokowania InterBase'a. Jeśli dodaje on pole do tabeli, którą edytują użytkownicy, a następnie zmienia jego wartość, to próba zablokowania tego samego rekordu przez inną transakcje skończy się informacją o błędzie zakleszczenia transakcji (deadlock). Na tym właśnie polega blokowanie rekordów, a nie na wpisywaniu wartości! Nawet jeśli Psujak przy wchodzeniu do edycji nadpisywałby pole wartością 0, a nie 1 to i tak rekord będzie zablokowany dla innych transakcji (użytkowników). Inaczej trzeba by tylko było obsłużyć sprawdzanie blokady. Blokadę sprawdza się przez jej założenie! Jeśli się nie uda i wystąpi deadlock, to znaczy, że rekord jest zablokowany, a jeśli założenie blokady się powiedzie, to rekord można edytować. Mam nadzieję, że treść nie jest zbyt agresywna. Zapraszam do dyskusji na ten temat. Traptak
Technical Details
Message-ID:
<01be88ce$1a0db8e0$037f8080@modem>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!cyfronet!security.net.pl!news.vogel.pl!cb21.szczecin.mtl.plReferences:
<3715CA78.F35A7F92@kki.net.pl> <ujBR2.1955$O1.27094@news.tpnet.pl>Show Full Headers
Complete Article Headers
From: "Traptak" <gidex@gryf.com.pl> Subject: Re: Blokowanie rekordów Newsgroups: pl.comp.lang.delphi.bazy-danych References: <3715CA78.F35A7F92@kki.net.pl> <ujBR2.1955$O1.27094@news.tpnet.pl> Message-ID: <01be88ce$1a0db8e0$037f8080@modem> X-Newsreader: Microsoft Internet News 4.70.1155 NNTP-Posting-Host: cb21.szczecin.mtl.pl X-NNTP-Posting-Host: cb21.szczecin.mtl.pl Date: 17 Apr 1999 14:33:20 +0100 X-Trace: 17 Apr 1999 14:33:20 +0100, cb21.szczecin.mtl.pl Lines: 40 X-Complaints-To: Usenet@vogel.pl Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!cyfronet!security.net.pl!news.vogel.pl!cb21.szczecin.mtl.pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit