[MSSQL] Blokowanie tabeli na jakiś czas

0

Witam,
chciałbym zablokować tabelę na krótką chwilę aby wykonać na niej kilka krytycznych operacji.

  1. Blokowanie tabeli na INSERT/DELETE/UPDATE
  2. Wykonanie INSERT/SELECT/DELETE/UPDATE
  3. Odblokowanie tabeli dla wszystkich innych procesów.

Jak to najlepiej zrobić?

0

Transakcja? Po co Ci lock na calej tabeli?

0

Może opisz jaką masz sytuację i da się z tego inaczej wybrnąć? Blokowanie całej tabeli może być niekorzystne przy dużych tabelach i dużym ruchu wielodostępnym.

0

jak napsal johny_bravo transakcja, ona odpowiedno w zaleznosci od potrzeb dokona odpowiednich lockow
a jesli juz bardzo recznie chcesz jakies lokowania wiecej robic, mozesz dodac hinty do query
http://blog.sqlauthority.com/2007/04/27/sql-server-2005-locking-hints-and-examples/

0

Insert, delete i update z tego co wiem, zawierają same w sobie niejawne transakcje.
Natomiast silnik bazodanowy sam blokuje sobie rzeczy, które w danej chwili musi. Po to "with (nolock)".

0

Moja sytuacja wygląda następująco: posiadam kilka procedur składowanych, które wykonują jakieś obliczenia i zapisują je do roboczej tabeli - nazwijmy ją WorkTable. Pod koniec obliczeń każda z tych procedur wywołuje inną procedurę, która analizuje wyniki obliczeń i zapisuje analizę do pliku. Ogólnie procedury nie są uruchamiane jednocześnie, ale czasami nachodzą na siebie i usuwają sobie wzajemnie dane lub je nadpisują. Nie jest to dobre, więc chciałbym na okres analizy danych zablokować tabelę WorkTable. Jak wykorzystać transakcję do zablokowania? Znalazłem taki artykuł, czy o to chodzi?

0

Musiałbyś bardzo dokładnie opisać treść wykonywanych instrukcji i strukturę tabel. Powinno dać się uniknąć blokowania całej tabeli na rzecz blokowania grupy rekordów poprzez zmianę instrukcji SQL lub struktur tabel.

0

proponuje wygodniejsze rozwiazanie

  1. albo niech kazda procedura ma osobna tabele na wyniki
  2. albo niech w WorkTable bedzie dodatkowa kolumna stanowiaca identyfikator mowiacy do kogo nalezy wynik
  3. albo w ogole zrezygnowac z tabli WorkTable i uzyc zmiennej tabelarycznej, ktora pozniej przekaze ja do dalesze obrobki (zapis do pliku)

nie wiem tylko co zanczy ze inna procedura na koniec analizuje wyniki i zapisuje analize do pliku
moze lepiej rozdzielic to na 2 fazy, analizy (rozumiem ze to jakis filtorowanie, grupowanie etc. wynikow) i zapisu do pliku (ktore jest niezalezne od analizy)

generalnie raczej pomysl nad rozwiazaniem, ktore nie bedzie nadpisywalo i kasowalo sobie wynikow (nawet jesli tysiace procedur beda dzialac rownolegle, inaczej to znaczy ze bledne zaprojektowales system), albo pomysl o jakims kolejkonowaniu wywloan procedur obliczeniowych, tak aby w tym samym czasie nie mogly dzialac 2 i wiecej, aby nie niszczyly sobie wynikow

0

Co do punktu drugiego, to też o tym myślałem. Byłoby to chyba jedna z rozsądniejszych rozwiązań. Zaciekawił mnie też punkt 3. Co to jest zmienna tabelaryczna? Jaka jest angielska nazwa? Czy można stworzyć w jednej procedurze tabelę lokalną i przekazać ją do innej procedury? Czy w tym kierunku należy iść z zmienną tabeleryczną?

0

masz tabele tymczasowe, ktore deklaruje sie rozpoczynajac od hash (#)
ale taka tabela istnieje fizycznie w bazie temp (do restartu serwera bazy danych), inne procedury (zapytania) rowniez moga z niej korzystac

sa jeszcze zmienne tabelaryczne (Table Variables), ktorych scope jest mniejszy, jak innych zmiennych, deklaruje je sie zaczynajac od at (@), przechowywane sa w pamieci
np. declare @myTab table (id int, name nvarchar(50))
mozemy na nich normalnie wykonywac wszystkie operacjie SCUD (http://en.wikipedia.org/wiki/Create,_read,_update_and_delete)

z tym przekazaniem jej dalej to sie zagalopowalem, bo zalezy jaki masz server 2005 czy 2008
w 2008 mozna http://blogs.techrepublic.com.com/datacenter/?p=168
w 2005 tego nie zrobisz, mozesz posilkowac sie np. xml, tworzysz z tabeli xml, przekazujesz go dalej, a pozniej dzialasz na nim uzywajac xquery

oczywiscie uzycie zmiennej tabelarycznej zalezy od tego ile danych chcesz tam wepchnac, poniewaz jest ona przetrzymywana w pamieci, to zbyt duza ilosc danych oraz brak statystyk, moga spowodowac ze uzycie tego typu tabeli spowolini zapytanie
ja staram sie uzywac tego typu zmiennych w przypadkcha kiedy mam na danym zbirze przeprowadzic jakis skomplikowane filtrowanie, ktorego wynik nastepnie uzywam w kilku podzapytaniach, zazwyczaj zapamietuje tylko jakies id przefiltrowanych obiektow
do tej pory notowalem wzrost wydajnosci vs tablica tymczasowa, ale jak napisalem moga byc przypadki kiedy nie bedzie to prawda

1 użytkowników online, w tym zalogowanych: 0, gości: 1