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

Откуда: Йобурк
Сообщений: 1005
Есть ХП выполняющая следующее:

insert into openquery('') select * from table

if @@error=0
delete from table


Во время insertа параллельно пользователи могут добавить что-то в таблицу..
Естественно это не выгрузится - но удалится..
заворачивать insert в транзакцию не получается - не поддерживается..

Вопрос - как заблокировать таблицу table на время выполнения хп?
Либо удалить из нее только то что было выгружено..

(Сейчас делается копия исходной таблицы и перед удалением из table сравнивается - добавились записи или нет - достаточно тормознуто это все получается)
18 мар 04, 08:26    [584142]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Я немного не понял - вопрос о блокировке внешних , не-сиквельных данных средствами сиквела?
18 мар 04, 11:42    [584669]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
Есть очередь (SQL таблица) - в которую постоянно инсертятся данные..
в процедуре данные из этой SQL таблицы выгружаются куда-то..
затем эти выгруженные данные надо удалить из таблицы.
Вопрос в том - как это организовать...
18 мар 04, 11:50    [584715]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
Quark
Member

Откуда: Екат
Сообщений: 1099
Можно попробовать проанализировать ту таблицу на предмет бизнесс-логики. Возможно использование какого-нибудь из полей как ваш признак вставки.
18 мар 04, 11:56    [584738]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
KOLCHOZ_POSTEVENT
Guest
Я бы не стал копаться в таблице,которая болеет хроническим инсертом,можно прохавать дед-лок,который убирается только килой,помашите ручкой вашему инсерту.
Чёб я сделал,если б меня спросили,но вы ведь меня не спрашиваете.
Так я скажу сам.
1)раз в час или в пол-часа преименовал бы вашу table в table1
2)создал бы table,нехай дальше страдает инсертом.
3)эту table1 вывалил бы в спокойную таблицу t_spokucha
4)дропнул бы table1
5)пошёл спать.
А юзер пусть уж долбит t_spokucha.
Опаздание,вы скажите,а я скажу:не мешайте спать.
18 мар 04, 12:58    [584950]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
А я бы добавил в таблицу столбец timestamp.

declare @currenttimestamp timestamp

set @currenttimestamp=@@DBTS
insert into openquery('') select [all fields - timespampcol] from table where timespampcol<@currenttimestamp
if @@error=0
delete from table where timespampcol<@currenttimestamp
18 мар 04, 13:07    [584980]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
2KOLCHOZ_POSTEVENT
То что пойти спать - это хорошо придумано :)
ХП запускается каждую минуту - боязно что-то табличку каждый раз переименовывать..
Insertы в основном идут вялые.. изредка только один очень большой:

размер таблицы - от 0 до 100000

Пока придумал вот что(похоже как и у злого шамана ):
добавляю в table (idcount int identity(1,1))

ХП:

select @val=max(idcount) from table

insert into openquery('') select * from table where idcount<=@val
if @@error=0
delete from table where idcount<=@val

только identity вроде и не нужно больше ни для чего .. - а тут еще и индекс надо вешать...
18 мар 04, 13:26    [585048]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2506
BOL -> Locking -> Customizing Locking with SQL Server -> Locking Hints
В таблице подберите себе соответсвующие виды блокировок для операций чтения и записи
18 мар 04, 14:57    [585368]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
2 Александр Спелицин
В том то и беда что openquery не заворачивается в транзакцию..
а значит просто Lock hint не получится использовать..
(так как имеем как минимум 2 statementa)
18 мар 04, 15:08    [585413]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Навскидку, есть BEGIN DISTRIBUTED TRANSACTION. Надо
проверять, только не знаю - поможет ли...
18 мар 04, 15:15    [585437]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
а разве координатор распределнных транзакций (Microsoft Distributed Transaction Coordinator (MS DTC)) для этого случая не подойдет?
18 мар 04, 15:19    [585447]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
Я выгружаю в dbf ( а на самом деле даже не в одну) - получается слишком большой объем, для того чтоб делать в одной транзакции.

(да плюс ко всему еще и не дает эту самую транзакцию сделать :)
18 мар 04, 16:55    [585759]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка(защита) таблицы на запись вне транзакции  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Можно сделать комбинированное решение
Сделать две таблицы - то есть ничего не ренеймить
В одну вставлять
Вторую сбрасывать
Все делать процами
Признак что делать с какой хранить в третьей таблице
Все :)
Ничего лишнего (identity + индекс) и достоинства от всех предложенных решений (отсутствие лишних блокирвок) :)
22 мар 04, 13:09    [590045]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить