Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Есть очень маленькая таблица с большим количеством апдейтов и на ней возникают постоянные блокировки. Что потенциально можно сделать в таком случае, подскажите, пожалуйста? spBlitz про нее: Lock Waitsdbo.SEQUENCES.PK_SEQUENCES (1): Row lock waits: 569,172; total duration: 13,942 minutes; avg duration: 1 seconds; Lock escalation attempts: 2; Actual Escalations: 0. NC indexes on table: 0 spBlitz про индекс на ней: Usage StatsReads: 46,954,297 (46,954,289 seek 8 scan) Writes:15,726,100 Op Stats46,954,289 singleton lookups; 26 scans/seeks; 0 deletes; 15,725,898 updates; Size171 rows; 0.1MB SQL для создания таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 10:16 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedov, Добавлю, при разборе блокировок видно что удерживается индекс PK_SEQUENCES в режиме X. Работа идет по сути только с 2мя записями в этой таблице, во всяком случае в блокировках фигурируют только они. Эти записи что-то типа счетчика, каждый коннект к БД его увеличивает, дисконнект уменьшает. Коннектов до 1000 одновременно работающих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 10:30 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovЧто потенциально можно сделать в таком случаеВ случае конфликта писатель-писатель - ничего. При конфликте читатель-писатель - грязное чтение, RCSI, snapshot isolation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 11:16 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovЧто потенциально можно сделать в таком случаеДобавлю к ответу invm, старайтесь блокировать на максимально короткое время, если это возможно. invmПри конфликте читатель-писатель - грязное чтение, RCSI, snapshot isolation.Гразное чтение или snapshot isolation ТС вряд ли подойдёт, это же получение счётчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 13:10 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvgГразное чтение или snapshot isolation ТС вряд ли подойдёт, это же получение счётчика.Зависит от предназначения читаемого. А оно нам неведомо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 13:25 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invmalexeyvgГразное чтение или snapshot isolation ТС вряд ли подойдёт, это же получение счётчика.Зависит от предназначения читаемого. А оно нам неведомо.Вангую, что это самодельный идентити. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 13:33 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvgВангую, что это самодельный идентити.Зависящий от числа коннектов? Очень странный иднентити :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 14:09 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovЕсть очень маленькая таблица с большим количеством апдейтов и на ней возникают постоянные блокировки. Что потенциально можно сделать в таком случае, подскажите, пожалуйста? 1. Критическая секция и sp_getapplock. 2. Самый ленивый вариант: update with(tablockx). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 14:54 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Помещение таблицы в память в таком случае могло бы помочь? Хотя ФС на сервере внешняя СХД и сама по себе очень быстрая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 18:05 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovПомещение таблицы в память в таком случае могло бы помочь? Хотя ФС на сервере внешняя СХД и сама по себе очень быстрая.Мог бы помочь анализ архитектуры вашего приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 18:10 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
aleks222, Читал про sp_getapplock, но так и не понял чем она поможет. Как понимаю это тоже блокировка на запись, но наложенная приложением. Остальные коннекты так же будут висеть и ждать её? Верно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 18:47 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей Алексеевич, Как это правильно сделать? Есть может какая-то информация на эту тему? Или, если ПО от стороннего разработчика, то как верно адресовать ему этот вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 19:50 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovГавриленко Сергей Алексеевич, Как это правильно сделать? Есть может какая-то информация на эту тему? Или, если ПО от стороннего разработчика, то как верно адресовать ему этот вопрос?Давайте начнем с простого вопроса -- какие у вас проблемы с перфомансом? Или вы просто скрипт запустили и испугались? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 20:15 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей Алексеевич, Проблемы ежедневно практически в одно и тоже время. Количество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. При этом у пользователей все встаеет, начинаются звонки и жалобы. Порой это чаще, раз 5-10 в день, порой 1 раз или редкие дни что ни разу. В итоге решили понять в чем причина, так как какой то связи пока проследить не получается. Запустил на день трейс на эскалации и блокированные процессы. На двух таблицах были эскалации, но блокировки возникали на той что привел в первом посте. Поэтому эскалации оставил на потом, считая что дело не в них. Пока решил попробовать разобраться с блокировками. С бд работают около 10 серверов веб приложения. Через веб подключаются пользователи. Какая-то ещё нужна информация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 20:31 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvgssedovЧто потенциально можно сделать в таком случаеДобавлю к ответу invm, старайтесь блокировать на максимально короткое время, если это возможно. invmПри конфликте читатель-писатель - грязное чтение, RCSI, snapshot isolation.Гразное чтение или snapshot isolation ТС вряд ли подойдёт, это же получение счётчика. Если запросы работают с малым числом строк, то может быть, имеет смысл использовать подсказку ROWLOCK? https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 20:36 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovесли ПО от стороннего разработчика, то как верно адресовать ему этот вопрос? Примерно вот так ssedov ежедневно практически в одно и тоже время ( указать время и конкретные дни ). Количество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. у пользователей все встаеет, начинаются звонки и жалобы. Порой это чаще, раз 5-10 в день, порой 1 раз или редкие дни что ни разу Разработчик знает лучше свою архитектуру и быстрее может сказать в чем косяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 21:02 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovКоличество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. При этом у пользователей все встаеет, начинаются звонки и жалобы.Вот когда такое случится, смотрите в sys.dm_os_waiting_tasks кто кого ждет. Или sp_who2. Или скачайте себе sp_whoisactive и смотрите ей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2018, 21:44 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovssedov, каждый коннект к БД его увеличивает, дисконнект уменьшает. Коннектов до 1000 одновременно работающих. А каким образом отлавливается коннект/дисконнект? Триггер on logon/logoff? И если триггер - update тоже выполняется этим же триггером? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 00:17 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
flexgen, Если верно все понимаю, то вся работа с БД происходит через АПИ. Оно при входе/выходе дёргает хранимку, которая обращается к указанной таблице. Далее в этой таблице есть счётчик связанный с заявками, он тоже дёргается каждый раз когда с заявкой выполняется действие. В итоге эта таблица получается самая активная на апдейты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 08:06 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invm, Как понимаю кто кого ждёт я посмотрел. Смотрел разными скриптами и профайлером до кучи. В итоге выводы об ожиданиях в первом посте привёл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 08:08 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvg Если запросы работают с малым числом строк, то может быть, имеет смысл использовать подсказку ROWLOCK? https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017 Почитал про нее. Но как понимаю у меня идет блокировка индекса. В трейсе вижу это так авторwaitresource="KEY: 5:72058307143598080 (85be1f2715d1)" waittime="10069" Если докопаться до значения, то это конкретная запись в таблице, т.е. 1 строка. Верно понимаю что это и есть блокировка на строку и здесь нет расширения блокировки на таблицу или страницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 08:41 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovВ итоге выводы об ожиданиях в первом посте привёл.Суммарная информация об ожиданиях - это как "средняя температура по больнице". Надо найти причину происходящего. Например, в "час Х" резко возрастает количество коннектов/дисконнектов. Или просто запускается длительная транзакция, и остальные ждут ее окончания. И т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 11:02 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovПроблемы ежедневно практически в одно и тоже время. Количество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. При этом у пользователей все встаеет, начинаются звонки и жалобы. Порой это чаще, раз 5-10 в день, порой 1 раз или редкие дни что ни разу. В итоге решили понять в чем причина, так как какой то связи пока проследить не получается. Запустил на день трейс на эскалации и блокированные процессы. На двух таблицах были эскалации, но блокировки возникали на той что привел в первом посте. Поэтому эскалации оставил на потом, считая что дело не в них. Пока решил попробовать разобраться с блокировками. С бд работают около 10 серверов веб приложения. Через веб подключаются пользователи.- А вы отследили цепочку блокировок, когда у пользователя "всё встаёт"? - Исходной точкой является обращение к SEQUENCES? - Обращение, на котором блокируется, всегда один и тот же запрос? - Почему проблема не постоянная, а проявляется периодически? Что меняется в запросах, когда она возникает? - И на какое время блокируется SEQUENCES? На работу с ней, или в общей транзакции? - Когда появились эти проблемы? Что то менялось, кто либо полдключался кк серверу для проведения каких то действий (например, для апдэйта софта)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 11:49 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
PizzaPizzassedovесли ПО от стороннего разработчика, то как верно адресовать ему этот вопрос? Примерно вот так ssedov ежедневно практически в одно и тоже время ( указать время и конкретные дни ). Количество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. у пользователей все встаеет, начинаются звонки и жалобы. Порой это чаще, раз 5-10 в день, порой 1 раз или редкие дни что ни разу Разработчик знает лучше свою архитектуру и быстрее может сказать в чем косяк.В общем да, либо надо самим глубоко влезать в приложение, а не смотреть какие то "показатели", или обратиться к разработчику. Это уж вам решать, что будет быстрее и/или дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 11:53 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Есть сейчас для меня ряд вопросов на которые пока не могу ответить, т.к. не все данные имею. Похоже что наметил для себя ряд действий по поиску дополнительной информации о проблеме и по запросу к разработчику. Позже продолжу эту тему, пока же возьму перерыв на проработку полученных сведений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2018, 12:14 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedov, с таблицей глобального счетчика иначе нельзя работать - только сериализируемая блокировка. Иначе процессы при одновременном доступе получат/кстановят недостоверные идентификаторы. Разумеется, при этом выстроится очередь доступа к счетчику. Какого-то улучшения можно добиться лишь изменением логики и архитектуры данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 12:25 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
ssedovГавриленко Сергей Алексеевич, Проблемы ежедневно практически в одно и тоже время. Количество блокированных процессов вырастает от нескольких сотен, до почти двух тысяч. При этом у пользователей все встаеет, начинаются звонки и жалобы. Порой это чаще, раз 5-10 в день, порой 1 раз или редкие дни что ни разу. В итоге решили понять в чем причина, так как какой то связи пока проследить не получается. Запустил на день трейс на эскалации и блокированные процессы. На двух таблицах были эскалации, но блокировки возникали на той что привел в первом посте. Поэтому эскалации оставил на потом, считая что дело не в них. Пока решил попробовать разобраться с блокировками. С бд работают около 10 серверов веб приложения. Через веб подключаются пользователи. Какая-то ещё нужна информация? Вот тут самое оно перевести таблицу в InMemory и такое понятие как блокировка вообще исчезнет как класс, но вы версию не указали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 13:46 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
a_voroninВот тут самое оно перевести таблицу в InMemory и такое понятие как блокировка вообще исчезнет как класс, но вы версию не указали.Ээээ, "исчезнет как класс"? Блокировка - это не какая то "бага", которую поправили внедрением функционала InMemory, это фцнуциорал СУБД, гарантирующий атомарность изменения данных. Разумеется, для InMemory таблиц блокировки точно такие же, разве что реализованы другим кодом. Иначе были бы перекорёженные записи, где половина полей изменены одним процессом, а половина другим. ТС нужно просто делать блокировки короче, если это возможно. Например, без внешней транзакции, внутри простого апдэйта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 17:40 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
a_voroninВот тут самое оно перевести таблицу в InMemory и такое понятие как блокировка вообще исчезнет как класс, но вы версию не указали.Самое оно - читать вопросы внимательно и думать перед ответом. Как in-memory поможет ТС'у, у которого конкурентные обновления одной и той же строки?alexeyvgЭэээ, "исчезнет как класс"?Исчезнет. In-memory таблицы lock-free - применяются оптимистические блокировки. Соответственно, при конкурентном изменении одних и тех же строк, возникает конфликт и одна из транзакций откатывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 18:33 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
[quot invm]a_voronin Исчезнет. In-memory таблицы lock-free - применяются оптимистические блокировки . Соответственно, при конкурентном изменении одних и тех же строк, возникает конфликт и одна из транзакций откатывается. Кто на ком стоял? ЗЫ. Интересно, как "возникает конфликт", если "блокировки нет"? ЗЗЫ. Тредстартеру In-Memory помогут как мертвому припарки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 18:57 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invmalexeyvgЭэээ, "исчезнет как класс"?Исчезнет. In-memory таблицы lock-free - применяются оптимистические блокировки. Соответственно, при конкурентном изменении одних и тех же строк, возникает конфликт и одна из транзакций откатывается.А, точно. Просто это как бы базовое ограничение - "необходимо обеспечить атомарность". Так что не поможет, даже можно не читать про InMemory, что бы это понять. А то, что там откатывается, а не ждёт, я не помнил, не работаю с InMemory, но это уже детали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 19:12 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
aleks222Кто на ком стоял? ЗЫ. Интересно, как "возникает конфликт", если "блокировки нет"?Ну, не придирайтесь к словам :-) Блокировки нет, но ждать прога не будет, просто отвалится с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 19:19 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
aleks222Интересно, как "возникает конфликт", если "блокировки нет"?Тебе уже неоднократно говорилось - если не можешь что-то осознать, то это не означает, что этого не существует. При должном усердии, сможешь восполнить пробел в знаниях из статей и литературы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2018, 19:27 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invmaleks222Интересно, как "возникает конфликт", если "блокировки нет"?Тебе уже неоднократно говорилось - если не можешь что-то осознать, то это не означает, что этого не существует. При должном усердии, сможешь восполнить пробел в знаниях из статей и литературы. Если чего-то нет - этого нет. Если конфликт возникает => есть блокировка. Если гуру называет блокировку неблокировкой - это проблемы гуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 05:17 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
aleks222Если чего-то нет - этого нет. Если конфликт возникает => есть блокировка. Если гуру называет блокировку неблокировкой - это проблемы гуру.Для желающих поумничать и пожонглировать определениями: если чего-то нет, но некоторым особо одаренным кажется, что оно таки есть, то это проблемы особо одаренных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 10:10 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Интересное решение оптимистической блокировки... На разрешение записи оптимистическая предполагает два настраиваемых исхода - ожидание окончания блокирующей вставки или завершение с ошибкой. Вы пишете, что MS использует только вариант с ошибкой? Основное же назначение оптимистической - это разделить чтение и запись. Для чтения и записи используется версионирование страниц, т.е. читающие процессы используют версию из таблицы, а обновлённые страница попадают в свою версию транзакции. Варианты моменты фиксации, по идее, как описано выше. Автору версионирование категорически воспрещено. У него, похоже, проблема в том, что эта таблица - счетчик держится транзакциями процедуры, которая массово вызывается, а сами транзакции достаточно длительные, чтобы создавать очередь. Там дело не в таблице, а в архитектуре, создавшей бутылочное горлышко в виду этой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 11:06 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Владислав КолосовВы пишете, что MS использует только вариант с ошибкой?Вас не смущает, что при варианте с ожиданием будет нарушение уровня изоляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 11:34 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invm, не пойму вопрос. Откуда появится нарушение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 13:15 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, Изоляция транзакций для in-memory таблиц основана на версиях строк. Самый низкий TIL для таких таблиц - SNAPSHOT. Следовательно, если реализовать механизм ожидания для конкурентных update'ов, то невозможно гарантировать, что мы изменяем то же самое значение, что было на момент начала транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 14:01 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Владислав Колосовinvm, не пойму вопрос. Откуда появится нарушение?Две транзакции сделали обновление строки, изменили поле field = field + 1 Значение field было равно 100 Каждая транзакция в своей копии строки установила значение поля 101. Далее первая записала 101, второй что записывать, тоже 101? Это нарушение целостности данных. Потому что выполнение двух запросов field = field + 1 должно увеличить field на 2, а не на 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 14:39 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, https://docs.microsoft.com/ru-ru/sql/database-engine/transactions-in-memory-optimized-tables ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 14:41 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvgВладислав Колосовinvm, не пойму вопрос. Откуда появится нарушение?Две транзакции сделали обновление строки, изменили поле field = field + 1 Значение field было равно 100 Каждая транзакция в своей копии строки установила значение поля 101. Далее первая записала 101, второй что записывать, тоже 101? Это нарушение целостности данных. Потому что выполнение двух запросов field = field + 1 должно увеличить field на 2, а не на 1. Одна транзакция валиться, делает retry, обновляет на 102 . Скажем так, побыстрее это шуршать будет, чем то, что сейчас имеем на физической таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 14:55 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Спасибо, понятное разъяснение. При оптимистическом накатывании кто последний обновил - тот и прав. Не имеет значения, что было до этого. По крайней мере, я сталкивался с такой реализацией оптимистического обновления в других системах. Это вариант Б, о котором я писал. Логика понятна в целом - во избежание претензий со стороны эксплуатации лучше перебдеть, чем недобдеть и вариант Б не реализовывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 14:57 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
a_voroninОдна транзакция валиться, делает retry, обновляет на 102 . Скажем так, побыстрее это шуршать будет, чем то, что сейчас имеем на физической таблице.О, какая круть. Оказывается долбать сервер повторами транзакций (причем не важно, что было в этой транзакции до проблемного момента), оказывается выгоднее ожидания блокировки... Наверное у вас даже есть экспериментальные подтверждения этому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 15:23 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
a_voroninalexeyvgпропущено... Две транзакции сделали обновление строки, изменили поле field = field + 1 Значение field было равно 100 Каждая транзакция в своей копии строки установила значение поля 101. Далее первая записала 101, второй что записывать, тоже 101? Это нарушение целостности данных. Потому что выполнение двух запросов field = field + 1 должно увеличить field на 2, а не на 1. Одна транзакция валиться, делает retry, обновляет на 102 . Скажем так, побыстрее это шуршать будет, чем то, что сейчас имеем на физической таблице.Разве быстрее второй транзакции делать всё заново, после того, как завершиться первая, чем подождать до конца первой? Ведь ожидание-то одинаковое, в любом случае второй траназкции придётся ждать окончания первой, она же раньше не сможет продолжиться. Понятно, что в каких то случаях такой алгоритм полезен, иначе зачем его сделали? Например, в случае достаточно больших обновлений стоимость классического механизма блокировки отдельных строк слишком велика, поэтому происходит эскалация, а из за неё заблокированные транзакции ждут, хотя могли бы не ждать, т.к. они обновляют не те данные, которые затронуты блокирующей транзакцией. Но в данном конкретном случае выгоды не будет, потому что речь об одной и той же строке таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 17:49 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Владислав КолосовПри оптимистическом накатывании кто последний обновил - тот и прав. Не имеет значения, что было до этого.При "оптимистическом накатывании" первый и есть последний. Остальные ничего накатить не смогут, ибо данные уже изменены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2018, 17:53 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvga_voroninпропущено... Одна транзакция валиться, делает retry, обновляет на 102 . Скажем так, побыстрее это шуршать будет, чем то, что сейчас имеем на физической таблице.Разве быстрее второй транзакции делать всё заново, после того, как завершиться первая, чем подождать до конца первой? Ведь ожидание-то одинаковое, в любом случае второй траназкции придётся ждать окончания первой, она же раньше не сможет продолжиться. Понятно, что в каких то случаях такой алгоритм полезен, иначе зачем его сделали? Например, в случае достаточно больших обновлений стоимость классического механизма блокировки отдельных строк слишком велика, поэтому происходит эскалация, а из за неё заблокированные транзакции ждут, хотя могли бы не ждать, т.к. они обновляют не те данные, которые затронуты блокирующей транзакцией. Но в данном конкретном случае выгоды не будет, потому что речь об одной и той же строке таблицы. В данном случае надо было задействовать sequence и непонятно почему это было не сделано. Если это невозможно из-за низкой версии, то надо предгенерить значения или использовать очередь в брокере, что возможно уже давно и дает параллельность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2018, 12:18 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
invmВладислав КолосовПри оптимистическом накатывании кто последний обновил - тот и прав. Не имеет значения, что было до этого.При "оптимистическом накатывании" первый и есть последний. Остальные ничего накатить не смогут, ибо данные уже изменены. Да, это понятно, по варианту А - кто первый встал, того и тапки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2018, 13:25 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
a_voroninВ данном случае надо было задействовать sequence и непонятно почему это было не сделано. Если это невозможно из-за низкой версии, то надо предгенерить значения или использовать очередь в брокере, что возможно уже давно и дает параллельность.Да, или IDENTITY Но это уже другой вопрос. Может, у них какой то особый алгоритм формирования этого номера, определяемый, скажем, внешними правилами (скажем, государственными нормативными актами, или давно принятыми локальными нормативными актами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2018, 16:30 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
alexeyvga_voroninВ данном случае надо было задействовать sequence и непонятно почему это было не сделано. Если это невозможно из-за низкой версии, то надо предгенерить значения или использовать очередь в брокере, что возможно уже давно и дает параллельность.Да, или IDENTITY Но это уже другой вопрос. Может, у них какой то особый алгоритм формирования этого номера, определяемый, скажем, внешними правилами (скажем, государственными нормативными актами, или давно принятыми локальными нормативными актами). Или про identity, @@identity и scope_identity() и не слышали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2018, 22:55 |
|
||
|
Aggressive Under-Indexing
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял автора, то эта таблица не решает задачу раздачи идентификаторов. Так что не совсем понятно каким образом тут поможет SEQUENCE, IDENTITY и т.д. Как уже написали в одном из первых постов - тут явно нужен анализ архитектуры. Судя по всему автор темы еще даже не исследовал что же именно происходит на сервере в моменты "когда все тормозит". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2018, 01:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1688617]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 272ms |
| total: | 458ms |

| 0 / 0 |
