Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
здравствуйте!
mssql2005.
мне надо почистить большую таблицу T_TBL2CLEAN (более 60млн.строк):
CREATE TABLE TBL2CLEAN([id] [int] IDENTITY(1,1) NOT NULL,[text] [nvarchar](64) NOT NULL,[lasttime] [datetime] NULL,
 CONSTRAINT [PK_T_T_TBL2CLEAN] PRIMARY KEY CLUSTERED ([id] ASC)...
CREATE UNIQUE NONCLUSTERED INDEX [IX_T_TBL2CLEAN] ON [dbo].[T_TBL2CLEAN] ([text] ASC)...
При этом удаляемые стрОки надо перенести в др.таблицу.
Делаю так. Отключаю индекс, удаляю, включаю индекс. Без отключения индекса чистка будет работать "вечно".
ALTER INDEX IX_T_TBL2CLEAN ON T_DICTIONARY DISABLE
DELETE T_TBL2CLEAN OUTPUT DELETED.id,DELETED.text INTO T_TBL2MOVE  FROM T_DICTIONARY WHERE lasttime<''' + @time+''''
ALTER INDEX IX_T_TBL2CLEAN ON T_TBL2CLEAN REBUILD
При этом десяток "пользователей" производит попытки записи в T_TBL2CLEAN. Соответственно, при этом они могут испортить T_TBL2CLEAN, записав туда стрОки с одинаковым полем "text" (т.к. индекс IX_T_TBL2CLEAN отключен).
Как блокировать "пользователей", чтоб не смогли читать-писАть таблицу, пока работает очистка?
пробовал begin transaction - не помогает (вообще не думаю, что transaction относится к этому).
спасибо заранее.
19 май 11, 13:18    [10677676]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
tablockx на таблицу, и никто с ней уже ничего не сможет сделать.

А чтобы не мучаться с переносом большого объема данных, придумали секционирование.
19 май 11, 13:20    [10677693]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
aleks2
Guest
1. Это очень сильно зависит от "чо можна сделать с таблицей".
2. Если можно делать все, и никто не обидится...
3. Делаем ИДЕНТИЧНУЮ времянку-пустышку с индексами.
4. В транзакции ПЕРЕИМЕНОВЫВАЕМ основную, а пустышку обзываем как ОСНОВНУЮ.
5. Делаем с ПЕРЕИМЕНОВЫВАнной основной все что нада.
6. Переименовываем взад.
7. Копируем записи из времянки.
19 май 11, 13:23    [10677724]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
Еще одна возможность - переименовать исходную таблицу, создать новую с именем старой таблицы и перенести туда остающиеся данные. Это может быть выгодно в зависимости от объемов удаляемых/остающихся строк.

Или так
DELETE top (100000) T_TBL2CLEAN OUTPUT DELETED.id,DELETED.text INTO T_TBL2MOVE  FROM T_DICTIONARY WHERE lasttime<''' + @time+''''
go 100500
19 май 11, 13:24    [10677729]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
Критик
DELETE top (100000) T_TBL2CLEAN OUTPUT DELETED.id,DELETED.text INTO T_TBL2MOVE  FROM T_DICTIONARY WHERE lasttime<''' + @time+''''
go 100500
а что значит
go 100500
?
19 май 11, 14:57    [10678672]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
насчет tablockx:
надо блокировать таблицу на время выполнения нескольких запросов. Как сделать это с tablockx? сомнение...
19 май 11, 15:00    [10678706]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
автор
а что значит
go 100500
?



http://msdn.microsoft.com/en-us/library/ms188037.aspx
19 май 11, 15:09    [10678766]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
vv40in
насчет tablockx:
надо блокировать таблицу на время выполнения нескольких запросов. Как сделать это с tablockx? сомнение...


выставить уровень изоляции соответствующий
19 май 11, 15:10    [10678781]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
vv40in
насчет tablockx:


только "грязное" чтение к таблице возможно...делайте уж сразу блокировку Sch-M, а лучше, как уже сказали сделать временную таблицу взамен вашей, а вашу переименовать и работать
19 май 11, 15:12    [10678800]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Glory
Member

Откуда:
Сообщений: 104751
vv40in
насчет tablockx:
надо блокировать таблицу на время выполнения нескольких запросов. Как сделать это с tablockx? сомнение...

Несколько запросов, выполняемых как одно целое, называеются транзакцией. И соответственно продолжительность блокировки можно регулировать транзакцией
19 май 11, 17:25    [10680140]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
Glory
Несколько запросов, выполняемых как одно целое, называеются транзакцией. И соответственно продолжительность блокировки можно регулировать транзакцией
но ведь в begin tran не указываются блокировки. или их как-то всё же можно указать?
19 май 11, 19:33    [10680689]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
Knyazev Alexey,
к сожалению, временная таблица (ВТ) не подходит по той причине, что за время очистки оригинала, в ВТ попадут стрОки текста, имеющие др. id в оригинале. На эти стрОки и по этим, вновь пришедшим id , к моменту завершения очистки будут ссылаться др. таблицы
19 май 11, 19:37    [10680702]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
Knyazev Alexey
автор
а что значит
go 100500
?

http://msdn.microsoft.com/en-us/library/ms188037.aspx

у меня mssql2005. по хелпам там нет повторов в go
19 май 11, 19:39    [10680706]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
vv40in
Knyazev Alexey
пропущено...

http://msdn.microsoft.com/en-us/library/ms188037.aspx

у меня mssql2005. по хелпам там нет повторов в go

это не фича скуля, а особенность поведения клиента, в 2005ом клиенте тоже работает
19 май 11, 21:59    [10681140]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
vv40in
Glory
Несколько запросов, выполняемых как одно целое, называеются транзакцией. И соответственно продолжительность блокировки можно регулировать транзакцией
но ведь в begin tran не указываются блокировки. или их как-то всё же можно указать?

можно указать уровень изоляции, который будет распростроняться на всю транзакцию, подсказка holdlock гарантирует удержание блокировки на время всей транзакции, tablockx будет удерживаться также всю транзакцию
19 май 11, 22:01    [10681143]     Ответить | Цитировать Сообщить модератору
 Re: как временно блокировать доступ (чт-зп) к таблице?  [new]
vv40in
Member

Откуда:
Сообщений: 122
Knyazev Alexey
...подсказка holdlock гарантирует удержание блокировки на время всей транзакции, tablockx будет удерживаться также всю транзакцию
Ура!!!! спасибо! наконец-то до меня дошлО! :) (но только после явного указания свойства tablockx). А вот tablock - не удерживается.
Держит:
begin tran
select top 1 * from таблица with(TABLOCKX)
waitfor delay '...'
commit tran
20 май 11, 11:03    [10682764]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить