2012-03-23 12 views
5

Mam dużą tabelę, która zostanie wypełniona z widoku. Dzieje się tak, ponieważ przeglądanie zajmuje dużo czasu i łatwiej jest udostępnić dane w tabeli. Procedura jest uruchamiana tak często, że aktualizuje tabelę.Zablokuj tabelę podczas wstawiania

TRUNCATE TABLE LargeTable 

INSERT INTO LargeTable 
SELECT * 
FROM viewLargeView 
WITH (HOLDLOCK) 

Chciałbym zablokować tę tabelę przy wkładaniu więc jeśli ktoś próbuje wybrać rekord nie otrzyma żadnej po skróconej. Blokada, której używam, wydaje się blokować widok, a nie tabelę.

Czy istnieje lepszy sposób rozwiązania tego problemu?

+1

Co powiesz na otwarcie transakcji przed wstawieniem i zamknięciem po? –

+0

Czy podczas otwierania transakcji inny użytkownik może wybrać z tabeli? – JBone

+0

FYI, polecam używać DELETE zamiast TRUNCATE, ponieważ TRUNCATE jest DDL, zamiast DML jak DELETE, a więc wymaga większych uprawnień. Dodatkowo, jeśli zawiniesz to w Transakcji (która jest poprawną odpowiedzią na twoje pytanie), skutecznie wykonają to samo. – RBarryYoung

Odpowiedz

4
BEGIN TRANSACTION t_Transaction 

BEGIN TRY 

TRUNCATE TABLE LargeTable 

INSERT INTO LargeTable 
SELECT * 
FROM viewLargeView 
    WITH (HOLDLOCK) 


COMMIT t_Transaction 

END TRY 

BEGIN CATCH 
    ROLLBACK t_Transaction 
END CATCH 
+0

Nie myśl, że to by w ogóle coś zrobiło. "Transakcja" nie ma wpływu na transakcję, a sama wstawka jest również transakcją, nawet jeśli jej nie określisz. – Andomar

+0

W rzeczywistości TRUNCATE są wycofywane z pewnymi zastrzeżeniami. Zobacz [to] (http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed /) –

4

To prawda, że ​​Twoja poprawna wskazówka dotycząca blokowania wpływa na widok źródła.

Aby zrobić to tak, że nikt nie może odczytać danych z tabeli, gdy jesteś wkładając:

insert into LargeTable with (tablockx) 
... 

Nie musisz nic robić, aby wyglądać pusty stół aż po zakończeniu wkładka. Wkładka zawsze jest uruchamiana w transakcji i żaden inny proces nie może odczytać niezatwierdzonych wierszy, chyba że wyraźnie określają one with (nolock) lub set transaction isolation level read uncommitted. Nie ma sposobu, aby chronić się przed tym, o ile wiem.

Powiązane problemy