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

Откуда:
Сообщений: 64
Есть 1С8, из которой через ADO сбрасываются данные на соседний SQL-сервер, а потом с него же забираются ответы.
Поскольку инициаторов чтония ответных данных может быть несколько, необходимо разрулить возможные коллизии.
А опыта работы с хинтами блокировок катострофически не хватает.

Итак, если я правильно понимаю, что нужно сделать так:

1) Начать транзакцию
2) прочитать необходимый блок новых данных:
Select * From Table (rowlock) where ...
3) обработать прочитанные данные
4) зафиксирвать обработанные данные (скажем, delete from Table where rowid in (...), где rowid - примарный ключ )
5) зафиксировать транзакцию

Собственно, хотелось бы уточнить:
1) Блокировки действую в течение транзакции;
2) Блокировка rowlock не позволит считать эти строки повторно (до завершения транзакции);
3) Блокировка rowlock позволит вставлять в таблицу другие данные (пусть даже они попадают под условия первого select-а с rowlock-ом);

Отдельно хотелось бы уточнить, каково будет поведение второго процесса, пытающегося прочитать заблокированные строки?
Он будет ждать, пока с этих строк не снимется блокировка, или же он прочитает все, попадающее под условия, окромя уже заблокированных строк?
12 апр 13, 08:03    [14170701]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
Satans Claws,

Проверяется все за 10 минут...

ps второй процесс может содержать свои подсказки, навроде nolock или readpast
12 апр 13, 08:22    [14170728]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Критик,

1) я не очень представляю, как смоделировать ситуацию
ибо, с одной стороны, процесс обработки данных достаточно быстрый - ручками я инициировать второй запрос наврядли сумею именно в этот же момент, а с другой - закладываться на коллизию все же нужно

2) снятие данных производится из разных сеансов 1Ски, по сути, запросы разных инициаторов идентичны с точностью до блока Where
12 апр 13, 08:51    [14170784]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Satans Claws
ибо, с одной стороны, процесс обработки данных достаточно быстрый - ручками я инициировать второй запрос наврядли сумею именно в этот же момент, а с другой - закладываться на коллизию все же нужно

waitfor после select позволит смоделировать задержку выполнения
12 апр 13, 09:06    [14170813]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Glory,

ок, понял.

Но мое общее понимание подхода верно, или ошибки начинаются с выбора хинта блокировки?
12 апр 13, 09:21    [14170866]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Satans Claws
Но мое общее понимание подхода верно, или ошибки начинаются с выбора хинта блокировки?

sp_lock после select-а покажет вам текущие блокировки.

Satans Claws
1) Блокировки действую в течение транзакции;
2) Блокировка rowlock не позволит считать эти строки повторно (до завершения транзакции);
3) Блокировка rowlock позволит вставлять в таблицу другие данные (пусть даже они попадают под условия первого select-а с rowlock-ом);

1. Не всегда. Могут и только в течении запроса.
2. Позволит. Этот хинт определяет гранулярность, а не тип блокировки.
3. Позволит

И еще
- вы ничего не говорите про уровень вашей транзакции
- зачем сначала что-то селектить для обработки ?
12 апр 13, 09:36    [14170936]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Glory
1. Не всегда. Могут и только в течении запроса.
2. Позволит. Этот хинт определяет гранулярность, а не тип блокировки.
3. Позволит

2) уточню - если второе соединение будет делать SELECT с таким же хинтом (rowlock), то ... ?

И еще
- вы ничего не говорите про уровень вашей транзакции

Вот тут я вообще тупень.
Просто вначале явынй BEGIN TRAN, после всей обработки и удаления обработанных строк - COMMIT TRAN.
Транзакция выполняется на СКЛ-сервере, отличном от СКЛ-сервера базы 1С. Т.е. я так понимаю, транзакции, организованные 1Ской для своих нужд вообще никак не коррелируют с транзакцией, организованной мной через АДО-соединение.

- зачем сначала что-то селектить для обработки ?

Как зачем?
Нам пришли данные из стороннего источника.
Нам а) надо их считать
б) обработать у себя
и в) сделать так, что не обработать их повторно

если пункты б) и в) еще и можно поменять местами, то пункт а) никуда не сдвинешь.

Если вы предлагаете вместо обработки данных внутри 1Ски и записи их штатными средствами в таблицы 1Ски, делать это напрямую апдейтом из АДО - то я еще не на столько долбанулся, чтоб делать это без лишней необходимости.
Конечно, один раз на 7.7++ приходилось иметь дело с заменой штатных механизмов на прямые запросы, но там была обоснованная необходимость.
12 апр 13, 10:00    [14171040]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Satans Claws
2) уточню - если второе соединение будет делать SELECT с таким же хинтом (rowlock), то ... ?

Вы какой смысл вкладываете в этот хинт ? Монопольную блокировку что ли ?

Satans Claws
И еще
- вы ничего не говорите про уровень вашей транзакции

Вот тут я вообще тупень.

Ну так узнайте про уровни изоляции транзакций.

Satans Claws
- зачем сначала что-то селектить для обработки ?

Как зачем?
Нам пришли данные из стороннего источника.
Нам а) надо их считать
б) обработать у себя
и в) сделать так, что не обработать их повторно

А сразу обработать нельзя что ли ? При обработке по-вашему чтения происходить не будет ?
12 апр 13, 10:05    [14171069]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Glory
Вы какой смысл вкладываете в этот хинт ? Монопольную блокировку что ли ?

Мне нужно, чтоб пока первое соединение не закончит транзакцию, второе соединение не смогло прочитать эти данные.
В принципе, конкретно в этом случае без разницы - будет ли второе соединение ждать, пока первое завершит транзакцию; или же второе соединение прочитает строки за исключением уже заблокированных.
Но для саморазвития, конечно лучше понимать, что именно происходит.



А сразу обработать нельзя что ли ? При обработке по-вашему чтения происходить не будет ?

Под обработкой я подразумеваю создание определенных документов в 1С. Понятно, что там будет и чтение, и запись - но эти чтения и записи я оставляю на совести 1С.
Заниматься еще и синхронизацией своих телодвижений с телодвижениями самой 1Ски у меня ни желания (ни, слава богу, необходимости) нет.

Т.е. я селектом через АДО получил в 1Ске COMSafeArray с данными и дальше уже работаю штатными средствами 1Ски. Ну, до тех пор, пока не понял, что все хорошо и следует удалить запись из внешней таблицы.
12 апр 13, 10:36    [14171281]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Satans Claws
Мне нужно, чтоб пока первое соединение не закончит транзакцию, второе соединение не смогло прочитать эти данные.

Вы прочитали о хинтах хотя бы то, что сказано в стандартном хелпе ?
Или вы сами придумываете, как бы мог работать тот или иной хинт ?
12 апр 13, 10:39    [14171300]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Glory
Вы прочитали о хинтах хотя бы то, что сказано в стандартном хелпе ?
Или вы сами придумываете, как бы мог работать тот или иной хинт ?


Естественно, прочитал.
И если бы из МСДН-хелпа я бы понял все на все 100%, то сюда с вопросами я бы не лез.
А раз я что-то не понял - значит, естественно, в какой-то степени я домысливаю, как же это все работает.

И во многом у меня вопрос даже не в том, как конкретно работает rowlock, а в том, как вообще работает система взаимодействия накладываемых блокировок. Ибо в МСДН-хелпе лок-хинты вообще описаны в общем разделе хинтов на таблицы, где ограничились вообще туманным "заставляет блокировать строки там, где обычно блокируется страница или таблица целиком".
И даже рабочих примеров у меня нет, ибо не смотря на большой опыт прямых запросов в 7.7++, от всех блокировок тут потребность только в nolock-е.
12 апр 13, 11:36    [14171672]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Если есть ссылка на статью, хорошо описывающую систему блокировок скуля - буду признателен.
12 апр 13, 11:39    [14171698]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Satans Claws
а в том, как вообще работает система взаимодействия накладываемых блокировок.

Все просто
если блокировки разных коннектов совместимы, то все коннекты получают доступ
если блокировки разных коннектов несовместимы, то все коннекты ожидают снятия блокировки
12 апр 13, 11:40    [14171707]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Если есть ссылка на статью, хорошо описывающую систему блокировок скуля - буду признателен.

статью - это оптимистично :)
книжка есть хорошая. электронную версию раздают бесплатно:
http://www.red-gate.com/community/books/sql-server-concurrency
12 апр 13, 11:45    [14171755]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
кажется, хинт updlock - то, что мне нужно
по крайней мере, тесты с waitfor дают поведение такое, какое нужно мне

но возможность/невозможность совместного использования хинтов взрывает мой моск :(
12 апр 13, 15:41    [14173749]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Satans Claws
но возможность/невозможность совместного использования хинтов взрывает мой моск :(

Что вы имеете в виду — можно пример?
12 апр 13, 16:00    [14173888]     Ответить | Цитировать Сообщить модератору
 Re: Правильно ли я использую хинты чтения таблицы?  [new]
Satans Claws
Member

Откуда:
Сообщений: 64
Гость333
Satans Claws
но возможность/невозможность совместного использования хинтов взрывает мой моск :(

Что вы имеете в виду — можно пример?


Ну, я так понял, можно одновременно указать хинт гранулярности и хинт уровня изоляции транзакции.
Но есть еще всякие прочие хинты - начиная от индекса и заканчивая всякими KEEPIDENTITY, KEEPDEFAULTS, FASTFIRSTROW.
Ну и т.д.
Короче, буду потихоньку курить мануалы.
14 апр 13, 06:45    [14177551]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить