powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Аля partiotioned view или partiotion by table
20 сообщений из 45, страница 2 из 2
Аля partiotioned view или partiotion by table
    #32881598
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь - плохо прокомментировал, рассчитывал на людей знающих о чем речь.
Код запускается конечно в двух сессиях причем между select и update нужно сделать паузу. Смысл возникновения дедлока в том что селекты делают Shared lock, а последующие апдейты одновременно пытаются перевести shared в update lock и успешно обламываются.
В MSSQL решается с помощью хинта в селект with updlock. В Sybase ASE я вижу выход разве что в недокументированнном Update t set @a = a. Но может кто знает способ лучше?
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883382
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чем же Update t set @a = a недокументированый ?
Да и можно вообще
Update t set a = a ...
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883383
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSА как это в пределах одной сессии можно дедлок вызвать или я чего то не понял ? В ASA к примеру этот код никаких проблем не вызовет, там придется не мало постараться, чтобы дедлок получить.

Никак. гонит он.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883388
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripА че кстати в row level locking в ASE сделано лучше чем в MSSQL2000?
То что при уровне изоляции read committed не блокируется все записи до конца запроса? Может быть это и хорошо только в MSSQL любой запрос благодаря этому отдельно становится как бы repeatable read, а в ASE получается, что если уровень изоляции не поднять то можно получить несогласованные данные.
То, что ты реально можешь добиться блокировки ТОЛЬКО на уровне строк в какой-то таблице, если тебе это надо (правда, возможно, угрохав на это кучу ресурсов сервера (на время транзакции), но это уже другой вопрос - раз надо , значит надо). В MSSQL все решает сам сервер, настроек нет.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883392
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripА че кстати в row level locking в ASE сделано лучше чем в MSSQL2000?
То что при уровне изоляции read committed не блокируется все записи до конца запроса?


Ты хоть понял, что сказал ? Все блокируется, транзакция не может не блокировать записи. Только блокируются СТРОКИ, и всегда (если настроить) Ну и соотв. дальнейшие твои расс. - ерунда полная, никаких несогласованных данных нет.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883448
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего это я гоню?
Про ASA не знаю. Говорю про ASE. Вы хотите сказать что дедлока не будет? Еще как будет! Поможет только предваряющий update.

Дальше вообще разговор слепого с глухим.
Я говорил о том что в MSSQL на уровне изоляции read committed блокируется все строки учавствующие в запросе до конца соответствующего стейтмента, то есть как будто бы устанавливается изоляция repeatable read для отдельного стейтмента.
В Sybase ASE это не так, если дополнительно не настраивать то в запросе на уровне read committed происходит только защита от грязного чтения, в результате чего читатели(select в одной сессии) не блокируют писателей(update в другой сессии).

Пожалуйста расскажите более подробно в чем я не прав, наверняка виновато мое так сказать "майкрософтовское" мышление.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883681
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение - когда я говорил о блокировках в последнем абзаце, то имелись ввиду конечно shared блокировки, которые в read committed не удерживаются до конца транзакции...
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883908
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripЧего это я гоню?

Не бывает DEADLOCK-а самого с собой. Если ты его видел - это значит, что тебе показалось.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883932
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv CripЧего это я гоню?

Не бывает DEADLOCK-а самого с собой. Если ты его видел - это значит, что тебе показалось.
Он имел ввиду, что SELECT и UPDATE в разных сессиях. То есть SELECT на чистом чтении блокирует только обрабатываемую на текущий момент запись и при переходе на следующую натыкается на эклюсивную блокировку UPDATE. В это время UPDATE пытается изменить запись, которая сейчас блокирована SELECT-ом, получается патовая ситуация (дедлок). Я что то типа того понял. Попробую на ASA смоделировать, но что то мне не верится, что я там дедлок получу.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32883971
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crip
Я говорил о том что в MSSQL на уровне изоляции read committed блокируется все строки учавствующие в запросе до конца соответствующего стейтмента, то есть как будто бы устанавливается изоляция repeatable read для отдельного стейтмента.


На сколько я помню, в MSSQL на read commited SHAREDLOCK-и на прочитанные данные снимаются по окончании чтения страницы (или записи), точно таким же образом, как это делается и в ASE, от которого и унаследован код сервера. Так было и в 6.0, и в 6.5. Может быть поманялось в 7. - 2000 - хотя вот цитата из BOL

BOL
The duration of share locks used to protect reads depends on the transaction isolation levels. At the default transaction isolation level of READ COMMITTED, a share lock is held only as long as it takes to read a page. In scans, the lock is held until a lock is acquired on the next page in a scan. If the HOLDLOCK hint is specified, or the transaction isolation level is set to either REPEATABLE READ or SERIALIZABLE, the locks are held to the end of the transaction.


Так что подозреваю что никакого блокирования до конца statement-а и никакого repeatable read на read commited не существует.

Crip
В Sybase ASE это не так, если дополнительно не настраивать

Что и как настраивать ?

Crip
то в запросе на уровне read committed происходит только защита от грязного чтения,


А интересно от чего еще нужно защищаться на уровне изоляции READ COMMITED, как ты полагаешь ?

Crip
в результате чего читатели(select в одной сессии) не блокируют писателей(update в другой сессии).


Нет, к сожалению, именно блокируют. И происходит это и в MSSQL, и в ASE. Если читатель читает например страницу данных, а в это же время писатель в другой сессии хочеть поменять эту страницу данных, то писатель будет ждать до тех пор, пока читатель не закончит чтение и не снимет Shared lock на страницу. Это может произойти по окончании чтения страницы (на read commited), или по окончании транзакции. Если ты посмотришь на таблицу совместимости блокировок, то увидешь, что SHARED не совместим с UPDLOCK.

Crip
Пожалуйста расскажите более подробно в чем я не прав, наверняка виновато мое так сказать "майкрософтовское" мышление.


Надеюсь, мне это удалось.

Напоследок могу сказать, что ASE действительно немного менее управляем в плане изоляции транзакций, чем MSSQL, но ... не там, где ты думаешь.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32884000
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Он имел ввиду, что SELECT и UPDATE в разных сессиях. То есть SELECT на чистом чтении блокирует только обрабатываемую на текущий момент запись и при переходе на следующую натыкается на эклюсивную блокировку UPDATE. В это время UPDATE пытается изменить запись, которая сейчас блокирована SELECT-ом, получается патовая ситуация (дедлок).


Если это действительно имелось в виду, то я абсолютно согласен - это ситуация DEADLOCK-а. Но она характерна для обоих серверов (ASE и MSSQL), а выходить из нее путем повышения изоляции на SELECT как-то не очень хорошо. Да и все равно

Crip
решается с помощью хинта в селект with updlock.


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

А бороться - известно как, путем указания других (возможно одинаковых) последовательностей сканирования таблиц.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32884070
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли это действительно имелось в виду, то я абсолютно согласен - это ситуация DEADLOCK-а. Но она характерна для обоих серверов (ASE и MSSQL),
Это и имелось ввиду.
авторНо она характерна для обоих серверов (ASE и MSSQL), а выходить из нее путем повышения изоляции на SELECT как-то не очень хорошо. Да и все равно
Никто не выходит из нее повышением уровня изоляции. Наоборот ситуация как раз возникает при повышение уровня изоляции выше read committed. В MSSQL есть специальный хинт updlock который говорит что при select нужно устанавливать не shared lock , а update lock, что позволяет избежать дедлока. В Sybase такого механизма я так понимаю нет, получается что нужно использовать предваряющий update.
авторНет, к сожалению, именно блокируют. И происходит это и в MSSQL, и в ASE. Если читатель читает например страницу данных, а в это же время писатель в другой сессии хочеть поменять эту страницу данных, то писатель будет ждать до тех пор, пока читатель не закончит чтение и не снимет Shared lock на страницу. Это может произойти по окончании чтения страницы (на read commited), или по окончании транзакции
В том то и проблема, что в Sybase ASE блокировки снимаются по мере того как страница будет считана (насколько я это понимаю, может ошибаюсь).
В MS SQL же насколько позволяют ресурсы происходит блокировка строк, причем она не снимается до того как все страницы не будут прочитаны.
Для примера достаточно просто запустить select занимающий продолжительное время и одновременно запустить update на одну строк ( время очень мало). В Sybase ASE update пройдет быстро или с незначительной задержкой, а в MSSQL будет висеть пока select не закончит работу.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32884104
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
Не совсем правильно поняли.
Сначала в обоих сессиях делается select,при это каждая накладывает shared блокировку. А потом из каждой сессии запускается update, но пройти он не может так как запись заблокирована селектами. Типичная ситуация для блокировки конвертирования.

2MasterZiv
Извините, но вы ведете себя как преподаватель, который уже решил какую оценку поставить студенту и пытается только доказать, что именно ее студент и заслуживает.
Наша задача не доказать друг другу кто умнее, тем более, что в уровне ваших знаний никто не сомневается, а выяснить истину. Быть может кому-то это еще пригодится, тем более, что людей разбирающихся в Sybase не так много.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32884426
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм, в ASA все легче:

на 1 уровне изоляции блокируется текущая запись, обрабатывается, блокировка снимается, берется следующая запись...

На 2 уровне во время прохода блокируются все записи, попадающие под условия запроса, блокировка снимается на COMMIT.

На 3 уровне изоляции блокируются все страницы, в которые попадают записи, удовлетворяющие условию запроса, таким образом если последняя страница не попадает под блокировку, в БД могут продолжать добавляться записи без каких либо задержек, а так же изменятся те, которые так же лежат на неблокированных страницах (страничная блокировка здесь сделана специально для снижения расхода ресурсов и предотвращения попыток изменения соседних записей, которые могли бы войти в понятие фантомов). Так же для особых случаев есть хинт эклюсивной позаписной блокировки (ни читать ни писать больше никто такие записи не может до выполнения блокирующей сессией оператора COMMIT) и табличной блокировки оператором LOCK TABLE. Если на таблице есть PK или Unique, то это позволяет ASA использовать на них свои виды фантомных и анти-фантомных блокировок и таким образом даже для 3-его уровня изоляции без существенных трудозатрат и понижения скорости позволять другим сессиям производить вставки записей. Ну а все что ниже 3-его уровня изоляции гарантированно блокируется только позаписно и можно спокойно изменять другие записи на тех же страницах, на которых были заблокированны записи тем же 2-ым уровнем изоляции.

С точки зрения производительности RowLevel блокировок хочу сказать, что приходилось делать UPDATE на 2-ом уровне изоляции на обьемы по 15 миллионов записей, не сказать что было затрачено слишком много ресурсов и времени на выполнение этой операции, при этом другие сессии продолжали работать с другими записями без проседаний и каких либо остановок.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32884433
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
В догонку

Вот здесь
описано как возникает дедлок и как лечить для MSSQL2000
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32885601
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crip
Извините, но вы ведете себя как преподаватель, который уже решил какую оценку поставить студенту и пытается только доказать, что именно ее студент и заслуживает.
Наша задача не доказать друг другу кто умнее, тем более, что в уровне ваших знаний никто не сомневается, а выяснить истину. Быть может кому-то это еще пригодится, тем более, что людей разбирающихся в Sybase не так много.

Вот интересно. Я тебе привел кусок из MSSQL-евской буки, где черным по белому написано, что и в MSSQL Shared снимается тут же при окончании чтения страницы. Ты же опять :

Crip
В том то и проблема, что в Sybase ASE блокировки снимаются по мере того как страница будет считана (насколько я это понимаю, может ошибаюсь).
В MS SQL же насколько позволяют ресурсы происходит блокировка строк, причем она не снимается до того как все страницы не будут прочитаны.


Кому мне верить , официальной документации или тебе ?

Crip
Никто не выходит из нее повышением уровня изоляции.


Это кто писал ?
Crip
В MSSQL решается с помощью хинта в селект with updlock.

Это что не повышение ?

автор
Наоборот ситуация как раз возникает при повышение уровня изоляции выше read committed. В MSSQL есть специальный хинт updlock который говорит что при select нужно устанавливать не shared lock , а update lock, что позволяет избежать дедлока. В Sybase такого механизма я так понимаю нет, получается что нужно использовать предваряющий update.
автор


Механизма нет, но ситуацию с дэдлоком это не спасло бы все равно. Что одна, что другая блокировка несовместима (в ASE по крайней мере) c UPDLOCK. Так что deadlock все равно будет.

И еще ты мне так и не сказал , от чего еще нужно защищаться на уровне изоляции READ COMMITED, кроме грязного чтения.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32885799
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто что не повышение ?
Ну не совсем... Для повышения уровня изоляции служит все-таки другой хинт.

Предваряющий update однако помогает в ASE, по поводу MSSQL см. статью.
авторКому мне верить , официальной документации или тебе ?
Хм... Еще раз сделал тест и получил как раз документированный результат.
Впрочем по идее так и должно быть, но у меня где-то по другому получилось. Запутался, что-то :(
авторИ еще ты мне так и не сказал , от чего еще нужно защищаться на уровне изоляции READ COMMITED, кроме грязного чтения
Да ничего конечно не нужно просто какой-то тест ввел меня в заблуждения по поводу блокировок в MSSQL, тем более что с ним уже почти год не работал, а от этих постоянных разговоров про неудобство блокировочника уже крыша наверное поехала. Не понимаю даже с чего я решил что блокировки удерживаются, ведь всю жизнь писали именно исходя как раз из документированного описания.

Спасибо за разъяснения, немного привел порядок в голову. Единственное я тогда не понимаю чем же row level locking в ASE лучше чем в MSSQL2000?
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32885864
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, надоело квотировать...

Ну не совсем... Для повышения уровня изоляции служит все-таки другой хинт.

Это именно оно и есть. Повышение. Только не в терминах ANSI isolation, а просто по жизни. Да и не вдруг ты сможешь сказать, какой это уровень в ANSI будет, там вообще такого нет, чтобы изоляция одной таблицы была бы выше других.

Предваряющий update однако помогает в ASE, по поводу MSSQL см. статью.

Да не помогает, причем ни там, ни там. То же самое будет, главное сканирование с разных концов таблицы обеспечить. Экслюзивная блокировка таблицы только помогает. Ну да ладно, не суть, от DEADLOCKов вообще говоря никогда полностью не избавишься.

А вот я могу сказать , чем ASE "хуже" MSSQL - на нем такого вот типа запрос для генерации следующего значения ключа в таблице

Код: plaintext
1.
select @next_id = isnull( max(id) ,  0  ) +  1  from myTable
ну ни за что не засериализуешь - будут генерироваться одинаковые значения при интенсивных вставках.

Единственное я тогда не понимаю чем же row level locking в ASE лучше чем в MSSQL2000?

Завтра напишу.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32885865
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже должен покаяться - я тут говорил про несовместимость SharedLock и UpdateLock. Так вот писал UpdateLock, а имел в виду на самом деле ExclusiveLock. Т.е не тот , который на фазе сканирования при UPDATE накладывается, а который на фазе изменения уже.

Да прочитал я статью - почти ничего нового для себя не почерпнул (т.е. мои знания MSSQL не так и устарели), окромя одной вещи - что для блокировки строки или страницы в кластерной таблице используется key lock. Вот это интересно, но им (MS-у) это ничего кроме разве что экономии lock-ов особенно не дает.
...
Рейтинг: 0 / 0
Аля partiotioned view или partiotion by table
    #32886157
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну по поводу Update lock и Exclusive lock я тоже местами напутал...
авторДа не помогает, причем ни там, ни там.
Как сказать... В MSSQL львиную долю дедлоков удавалось убирать именно таким способом, хотя согласен, что от всех не спасешься, надо все-таки транзакции максимально укорачивать, но профилактика по-моему не повредит.
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Аля partiotioned view или partiotion by table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]