Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Microsoft SQL Server / MSDE _ Blokowanie tabel

Napisany przez: Zbłąkany 8.07.2004, 23:36:49

Pytanie może banalne, ale nie mogę nigdzie znaleźć rozwiązania: czy Microsoft SQL Server 2000 (msde 2000 sp3a) obsługuje blokowanie tabel, coś takiego jak LOCK TABLES w mySQL?? niestety nie znalazłem manuala do Microsoft SQL Server 2000 sad.gif no i nie mam kiedy podjechać do Empiku aby sprawdzić w książce...

---Edited---

... trochę poszperałem, poprzeglądałem internet od tego czasu, bylem w empiku i niestety nie mieli na stanie tej książki sad.gif , ale oszczędzę tego innym co go nie mają tak dużo jakby chcieli, lub dostępu do internetu ...

W kwestii wyjaśnienia: wszystkie informacje przeze mnie prezentowane, są pobrane z kopii rozmowy z Markiem Adamczukiem z http://mssqlserver.org.pl, adres do topicu znajduje się http://mssqlserver.org.pl/webboard/display_topic_threads.asp?ForumID=4&TopicID=175&PagePosition=1 (niestety aby przeglądać to forum trzeba się zarejestrować), jeśli ktoś będzie szukał dodatkowych informacji proponuję zajrzeć do Microsoft SQL Server BOL można pobrać http://www.microsoft.com/downloads/details.aspx?FamilyID=a6f79cb1-a420-445f-8a4b-bd77a7da194b&DisplayLang=en (cenne źródło informacji na temat SQL Server 2000 i msde 2000).
Tyle tytułem wstępu biggrin.gif czas przejść do właściwych informacji:
Aby założyć blokadę na czas danej operacji (czyt. poleceń DELETE, INSERT, SELECT, UPDATE) potrzebujemy znać Locking Hints (po spolszczeniu HINT-y)
oraz wiedzieć do czego służą blokady tabel i poznać ich zasadę działania w Microsoft SQL Server 2000.
Najpierw przedstawię wykaz kilku HINT-ów:

Microsoft SQL Server 2000 blokuje każdą tranzakcję (czyt. zapytanie do bazy danych) swoim systemem. ... Dzieje się to automatycznie - transakcja blokuje zasoby których używa, o ile nie zostały zablokowane wcześniej innym niezgodnym lockiem. Nie zawsze blokowana jest cała tabela i nie wszystkie blokady powodują niemożność wykonania wszystkich innych operacji na zasobie. ...
Jeżeli chcemy założyć blokadę niestandardową na jakaś tabele, której pobieramy dane poleceniem SELECT to kod wyglądałby tak:
  1. <?php
  2. //connect do serwera SQL
  3. $query = &#092;"BEGIN TRAN; SELECT * FROM jakas_tabela [ WITH ( < table_hint > [ ,...n ] ) ]; COMMIT TRAN;\";
  4. $exec = http://www.php.net/mysql_query($query);
  5. ?>

Objaśnienie: BEGIN TRAN i COMMIT TRAN zapobiegają dopisaniu jakiejkolwiek wartości do każdej tabeli w bazie. Jeżeli chcielibyśmy zablokować tabele, tak aby żadne dane nie zostały dodane w czasie pobierania przez nas danych z jakiejś tabeli, na czas wykonywania kilku (ew. większej liczby) zapytań, to przed pierwszym zapytaniem musimy wstawić BEGIN TRAN, a po ostatnim COMMIT TRAN, by zwolnić blokadę na bazie.
Żeby blokada na tabelę zadziałała trzeba zdefiniować HINT-y, parametr WITH można pominąć, ale wtedy trzeba i tak umieścić listę HINT-ów w nawiasie okrągłym (z przecinkami), zaraz za nazwą tabeli, co z resztą ma miejsce również jak używamy WITH (wtedy jest to badziej czytelniejsze zapytanie, dla kogoś kto widzi takie pierwszy raz) też trzeba listę HINT-ów umieścić w nawiasie okrągłym (z przecinkami).
Przykład:
Mamy tabele:
lockme
id INT PRIMARY KEY; opisVARCCHAR(50);
W niej jeden wiersz id=1, opis=ktoś_go_dodał.
Napiszmy skrypt, który będzie pobierał ten wieersz i przy okazji zapobiegał zmodyfikowaniu go:
  1. <?php
  2. //connect do serwera SQL
  3. $query = &#092;"BEGIN TRAN; SELECT * FROM lockme WITH (HOLDLOCK, TABLOCK); COMMIT TRAN\";
  4. $exec = http://www.php.net/mysql_query($query);
  5. ?>

Wykaz umieszczania HINT-ów w zapytaniach INSERT, UPDATE oraz DELETE.Na koniec podam listy wszystkich HINT-ów i HINT-ów limitowanych używanych:
Wszystkie HINT-y:HINT-y limitowane:Zainteresowanych co do roli pozostałych HINT-ów, których nie opisałem w swoim spisie na początku polecam Microsoft SQL Server BOL oraz książkę Inside of SQL Server 2000 autorstwa Kalen Delaney

Napisany przez: scanner 14.07.2004, 10:01:48

Podpinam.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)