|
|
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
ASE 12.5.1 Подскажите пожалуйста, выполняю ХП: ....... as begin set transaction isolation level 0 declare @DebugLevel int execute @DebugLevel=DebugSPLogWrite @SPName, null, @@spid, 'begin' select * into #rep1_tmp_pay from rep_pay t1 left join contract_agents t2 on (t2.contract_id=t1.contract_id and t2.record_state < 150) where (t1.PAYMENT_TERM >= @IN_BEGIN_DATE) and (t1.PAYMENT_TERM <= @IN_END_DATE) ....... При выполнении видно, что таблица contract_agents и другие(далее по тексту) блокируется, хотя по идеи не должна, так как установлено isolation level 0 и для нее производится только выборка. И ещё, какого блокируется временка, они ж вроде не должны вообще блокироватся. В чем тут проблема? Как это можно обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 13:04 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Вы не только читаете но и пишите(into #rep1_tmp_pay from rep_pay t1). А грязная запись запрещена! Но можно сделать курсор с transaction isolation level 0 и в нем инсертить данные в вашу таблицу! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 16:05 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
За совет спасибо, только это делается для повыщения производительности, а использование курсора явно не ускорит работу ХП. А по поводу записи не понимаю почему не делать выборку на 0 уровне изоляции, а потом уже вставку на 1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 16:51 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Гость123456За совет спасибо, только это делается для повыщения производительности, а использование курсора явно не ускорит работу ХП. А по поводу записи не понимаю почему не делать выборку на 0 уровне изоляции, а потом уже вставку на 1 ? http://www.sql.ru/forum/actualthread.aspx?tid=504419 дочитайте до конца там все рассказано! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 17:50 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
А почему вы считаете что курсоры сильно тормозят? Я например токого не замечал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 17:53 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > А почему вы считаете что курсоры сильно тормозят? Я например токого не > замечал. Даже наоборот, в ASE они очень быстрые. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 18:40 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Гость123456 пишет: > as > begin > set transaction isolation level 0 > > declare @DebugLevel int > > execute @DebugLevel=DebugSPLogWrite @SPName, null, @@spid, 'begin' > > > select * > into #rep1_tmp_pay > from rep_pay t1 > left join contract_agents t2 on (t2.contract_id=t1.contract_id and > t2.record_state < 150) > where (t1.PAYMENT_TERM >= @IN_BEGIN_DATE) and (t1.PAYMENT_TERM <= > @IN_END_DATE) > > ....... > > При выполнении видно, что таблица contract_agents и другие(далее по > тексту) блокируется, хотя по идеи не должна, так как установлено > isolation level 0 и для нее производится только выборка. Вот это странно. По идее, не должна. Какие другие-то таблицы ? вроде бы одна там последняя. И как вы это видите ? > И ещё, какого блокируется временка, они ж вроде не должны вообще > блокироватся. Должны, как и все остальные. С чего вы взяли, что не должны ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 18:51 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
MasterZivВот это странно. По идее, не должна. Странно что блокируется? Почему странно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 19:01 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > Странно что блокируется? Почему странно? Потому что на чтении уровня 0 не должна таблица блокироваться. Оно может конечно из-за SELECT...INTO, может быть INSERT...SELECT работал бы по-другому (не знаю просто, практически никогда не использовали SELECT...INTO) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 19:33 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
По моему при SELECT...INTO или при INSERT...SELECT выставляется шаре блокировка на все таблицы во from(даже при isol.level 0). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 21:29 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > По моему при SELECT...INTO или при INSERT...SELECT выставляется шаре > блокировка на все таблицы во from(даже при isol.level 0). А источник такой уверенности в чём ? Как бы резона нет. То, что написано в топике, что это типа "пишущая" транзакция - это не совсем верно. Формируется набор данных в режиме чтения, записывается - в режиме записи. По идее ничто не мешает читающей части быть на read uncommitted. Я потом попробую проделать эксперимент. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 22:23 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
MasterZivА источник такой уверенности в чём ? только экспериментально! правдо таблицы все были APL. На DOL может ситуация другая будет, не проверял. А вы считаете что должна блокироваться только "rep_pay", а та что в джойне(contract_agents) не должна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 22:46 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: Вот результаты эксперемента: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Т.е. нельзя просто. А если вы указываете на уровне сессии изоляцию, то она для оператора вставки игнорируется. Но почему-то мне кажется, что это ограничение именно с изоляцией транзакций не связано. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2008, 23:34 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Я выше писал ссылку, там вы и moris подробно расказываете почему это сделать нельзя! http://www.sql.ru/forum/actualthread.aspx?tid=504419 MasterZivmoris wrote: Согласен, что штука не очень нужная, но однако > Т.к. согласно SQL92 требуется такая блокировка > > SQL-92 recognizes that the execution of > queries is dependant on the metadata of the tables involved, and requires > that access to such metadata must be serializable, even if the level of > isolation for the data is set to a lower level of isolation из этого не следует, что надо накладывать блокировку на саму таблицу. Можно наложить строчную блокировку на строку в sysobjects. Но sysobjects у нас - LOCK ALL PAGES, только в последнее время перевелись системные таблицы на DATAROWS. Так что вот и понятно, откуда ноги фичи растут. Вместо того, чтобы делать SHARED LOCK на страницу в sysobjects они (SI) предпочли делать SHARED TABLE на саму таблицу, поскольку такая блокировка меньше кому мешает. (SHARED LOCK на странице sysobjects мог бы мешать изменениям других таблиц, чьи строки лежали бы на этой же странице). Кстити можно предположить, что и в MSSQLServer не так все хорошо с этим, потому что как у них там что блокируется, никто не знает, все на откуп решениям сервера. Так что вполне может быть что это будет когда работать, а когда и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 09:12 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Интересно еще, будет ли выставляться шаре-блокировка на DOL таблице если по ней бежит курсор с уровнем изоляции 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 10:03 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > Я выше писал ссылку, там вы и moris подробно расказываете почему это > сделать нельзя! > Согласен, что штука не очень нужная, но > однако Вот ведь, и правда ! Забыл ! Там я поднаврал сначала немного, правда, но потом ничего так получился топик. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 15:55 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > Интересно еще, будет ли выставляться шаре-блокировка на DOL таблице если > по ней бежит курсор с уровнем изоляции 1? На всей таблице ? На строках - точно будут. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 15:56 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
MasterZiv cherrex_Den пишет: > Интересно еще, будет ли выставляться шаре-блокировка на DOL таблице если > по ней бежит курсор с уровнем изоляции 1? На всей таблице ? На строках - точно будут. выставляется sh_intent, это построчная блокировка? а для чего он вообще выставляет? таблица же DOL, select же не выставляет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 17:22 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Блокировка выставляется(sh_intent), но инсерты и апдэйты проходят! Так sh_intent(блокировка занятости) не блокирует данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 19:54 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > выставляется sh_intent, это построчная блокировка? > Так и такая, и такая есть. > а для чего он вообще выставляет? таблица же DOL, select же не выставляет! вы это с чего взяли ? я если ещё не совсем всё позабыл, выставляет. Как он может не выставлять sh_row, если это read committed ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 22:39 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > Блокировка выставляется(sh_intent), но инсерты и апдэйты проходят! > Так sh_intent(блокировка занятости) не блокирует данные? На каком уровне ? sh_intent -- это НЕ блокировка занятости. Это вспомогательная блокировка, которая говорит о том, что данная транзакция СОБИРАЕТСЯ, то есть будет накладывать shared блокировку на что -то. Она сама по себе нужна только чтобы снизить deadlock-ки. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 22:42 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
MasterZiv cherrex_Den пишет: > выставляется sh_intent, это построчная блокировка? > Так и такая, и такая есть. > а для чего он вообще выставляет? таблица же DOL, select же не выставляет! вы это с чего взяли ? я если ещё не совсем всё позабыл, выставляет. Как он может не выставлять sh_row, если это read committed ? На DOL таблицах выставлять не должен, если не взведен read committed with lock! perf1ru.pdfЗапросы с оператором select к таблицам с блокировкой только данных сначала устанавливают на таблицу разделяемую блокировку занятости. Блокировку страниц и строк данных можно настроить с помощью пара- метра read committed with lock следующим образом: • Если параметр read committed with lock равен 0 (значение по умолча- нию), то запросы с оператором select считывают значения столбцов, устанавливая мгновенные блокировки страниц и строк. Нужные зна- чения столбца или указатели на строку считываются в память, и бло- кировка снимается. Во время просмотра строк из внутренних таблиц соединений блокировки на внешние таблицы не устанавливаются. Это уменьшает число взаимоблокировок и повышает эффективность одновременных операций с базой данных. Даже если запросу с оператором select нужно только прочитать стро- ку, заблокированную блокировкой несовместимого типа, он все рав- но приостанавливается на этой строке до снятия этой блокировки. Если задать параметру read committed with lock значение 0, это не по- влияет на уровень изоляции; возвращаются только зафиксированные строки. • Если параметр read committed with lock равен 1, то запросы с операто- ром select устанавливают разделяемые блокировки страниц в табли- цах с блокировкой страниц данных и разделяемые блокировки строк в таблицах с блокировкой строк данных. Сначала устанавливается блокировка первой страницы или строки, затем – блокировка второй страницы или строки, а блокировка первой страницы или строки снимается. под мгновенной блокировкой - я думаю понимается защелки(latches) MasterZivcherrex_Den пишет: > Блокировка выставляется(sh_intent), но инсерты и апдэйты проходят! > Так sh_intent(блокировка занятости) не блокирует данные? На каком уровне ? sh_intent -- это НЕ блокировка занятости. Это вспомогательная блокировка, которая говорит о том, что данная транзакция СОБИРАЕТСЯ, то есть будет накладывать shared блокировку на что -то. Она сама по себе нужна только чтобы снизить deadlock-ки. Уровень 1! А в русском переводе intent называют блокировкой занятости. P.S. perf1ru.pdf - это переведенная ptg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 23:18 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > • Если параметр read committed with lock равен 1, то запросы с операто- Кажется у нас он стоит 1. Поэтому я и думаю так, что по-другому не бывает. Вообще, DOL и без read committed with lock =0 хорош. > Уровень 1! А в русском переводе intent называют блокировкой занятости. Да нет, на уровне чего : таблицы, строки/страницы ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 23:45 |
|
||
|
Блокировки
|
|||
|---|---|---|---|
|
#18+
Да на счет intent погорячился!!! она выставляется в любом случае. а шаре-строк или шаре-страниц не выставляется при select(на уровне 1 и на DOL) Чтоб вас не запутать: монопольная-эксклюзивная разделяемая-шаре ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2008, 23:50 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35655489&tid=2011281]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 375ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...