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

Откуда: Москва
Сообщений: 854
надо:
begin tran upd
  select @max_id = max(id) from table1
  --<теоретически здесь кто нить может добавить запись>
  insert into table1 (id, ...) select id + @max_id, ... from someTable
commit tran upd
Как наложить хинт чтоб между селектом и вставкой никто в таблицу ничего не записал?
27 дек 05, 14:50    [2213102]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
begin tran upd
  select @max_id = max(id) from table1 with(UPDLOCK)
  --<теоретически здесь кто нить может добавить запись>
  insert into table1 (id, ...) select id + @max_id, ... from someTable
commit tran upd
--кажись
27 дек 05, 14:54    [2213125]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
insert into table1 (id) 
select id + (select max(id) from table1) from someTable
27 дек 05, 14:55    [2213128]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
pkarklin
insert into table1 (id) 
select id + (select max(id) from table1) from someTable


Оригинально.
27 дек 05, 15:00    [2213171]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Это рещение, естественно, не будет оптмальным, при большом кол-ве записей в someTable!

ВОт тока мне не совсем понятно, это так и должно быть, что MAX() выбиратеся из id другой таблицы?
27 дек 05, 15:02    [2213187]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Всмысле не выбирается, а id из другой таблицы приплюсовывается к MAX(id).

ЗЫ. Возможно, что не совсем вьехал в задачу. :(
27 дек 05, 15:04    [2213202]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
pkarklin
Это рещение, естественно, не будет оптмальным, при большом кол-ве записей в someTable!

ВОт тока мне не совсем понятно, это так и должно быть, что MAX() выбиратеся из id другой таблицы?
Почему другой таблицы? Есть две таблицы с уникальными ID в одну таблицу мы добавляем записи из другой, чтоб сохранить уникальность к ID таблицы из которой вставляем добавляем максимальный ID таблицы куда вставляем, получим ID гарантированно не пересекутся
27 дек 05, 15:05    [2213215]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
pkarklin
insert into table1 (id) 
select id + (select max(id) from table1) from someTable
Меня видимо под новый год плющит как то по тяжелому :( Забыл как это должно быть.
Этот подзапрос не будет ли вызыватся для каждой строки по новой?
27 дек 05, 15:08    [2213231]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Вызываться он будет для каждой строки, но в SELECTе значение подзапроса будет одно и тоже. Именно про эту "неоптимальность" я упоминал. Можно "оптимизировать" с помощью CROSS JOIN.
27 дек 05, 15:16    [2213274]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
begin tran
select * from b with(HOLDLOCK, XLOCK) where b.id>IDENT_CURRENT('b')
insert into table1 (...) select  ... from someTable
commit tran
- вариант со вставкой родных identity без блокировки существующих записей
27 дек 05, 15:27    [2213331]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
saint
begin tran
select * from b with(HOLDLOCK, XLOCK) where b.id>IDENT_CURRENT('b')
insert into table1 (...) select  ... from someTable
commit tran
- вариант со вставкой родных identity без блокировки существующих записей
спасибо, но это немного не то.
27 дек 05, 15:43    [2213393]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
Этот подзапрос не будет ли вызыватся для каждой строки по новой?

Вообще говоря, подзапросы без внешней корреляции, выполняются один раз. Так что смело используйте вариант pkarklin
27 дек 05, 16:23    [2213594]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
saint
Этот подзапрос не будет ли вызыватся для каждой строки по новой?

Вообще говоря, подзапросы без внешней корреляции, выполняются один раз. Так что смело используйте вариант pkarklin
Вот в том то и дело, что я где то что то слышал про особенности обработки подзапросов, но где и что напроч забыл. Хочется с тобой согласится, но интуиция говорит иди в BOL :)
27 дек 05, 16:45    [2213693]     Ответить | Цитировать Сообщить модератору
 Re: как поставить блокировку намерение обновления  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
Soldat
saint
Этот подзапрос не будет ли вызыватся для каждой строки по новой?

Вообще говоря, подзапросы без внешней корреляции, выполняются один раз. Так что смело используйте вариант pkarklin
Вот в том то и дело, что я где то что то слышал про особенности обработки подзапросов, но где и что напроч забыл. Хочется с тобой согласится, но интуиция говорит иди в BOL :)
ой, как то фраза не хорошо получилась..., уточняю:
моя интуицыя мне говорит ...
27 дек 05, 16:47    [2213700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить