Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Blokowanie tabel, Prośba o pomoc
Zbłąkany
post 8.07.2004, 23:36:49
Post #1


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

Ostrzeżenie: (0%)
-----


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ę tutaj (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ć stąd (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:
  • HOLDLOCK - Trzyma blokadę do końca transakcji (czyt. do końca wykonania tranzakcji, ew. do końca wsadzania danych do tabeli), wg mnie najlepiej używać jeśli nie chemy aby przy odczycie danych z tabeli ktoś inny jej nie zmodyfikował. Jest równoważna z SERIALIZABLE.
  • READCOMMITED - Standardowa blokada do odczytu, kończy się w momencie zakończenia odczytywania z danej tabeli danych.
  • TABLOCK - Wymusza objęcie blokadą całej tabeli.
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 = 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 = mysql_query($query);
  5. ?>

Wykaz umieszczania HINT-ów w zapytaniach INSERT, UPDATE oraz DELETE.
  • Dla polecenia INSERT:
    INSERT INTO nazwa_tabeli WITH ( < table_hint_limited > [ ...n ] ) (lista_pól) VALUES (wartości_pól);
    Obowiązują tutaj wszystkie HINT-y za wyjątkiem: READPAST, NOLOCK oraz READUNCOMMITTED.
  • Dla polecenia UPDATE:
    UPDATE nazwa_tabeli WITH ( < table_hint_limited > [ ...n ] ) SET nazwa_kolumny1='wartość1', nazwa_kolumny2='wartość2';
    Obowiązują tutaj wszystkie HINT-y za wyjątkiem: READPAST, NOLOCK oraz READUNCOMMITTED.
  • Dla polecenia DELETE:
    DELETE FROM nazwa_tabeli WITH ( < table_hint_limited > [ ...n ] ) WHERE warunki;
    Obowiązują tutaj wszystkie HINT-y za wyjątkiem: READPAST, NOLOCK oraz READUNCOMMITTED.
Na koniec podam listy wszystkich HINT-ów i HINT-ów limitowanych używanych:
Wszystkie HINT-y:
  • FASTFIRSTROW
  • HOLDLOCK
  • NOLOCK
  • PAGLOCK
  • READCOMMITTED
  • READPAST
  • READUNCOMMITTED
  • REPEATABLEREAD
  • ROWLOCK
  • SERIALIZABLE
  • TABLOCK
  • TABLOCKX
  • UPDLOCK
HINT-y limitowane:
  • FASTFIRSTROW
  • HOLDLOCK
  • PAGLOCK
  • READCOMMITTED
  • REPEATABLEREAD
  • ROWLOCK
  • SERIALIZABLE
  • TABLOCK
  • TABLOCKX
  • UPDLOCK
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

Ten post edytował Zbłąkany 14.07.2004, 08:46:34


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
scanner
post 14.07.2004, 10:01:48
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Podpinam.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 00:32