powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Включить версионность для борьбы с блокировками
46 сообщений из 46, показаны все 2 страниц
Включить версионность для борьбы с блокировками
    #39896012
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У одного из клиентов при определенной наша база начинает тормозить, при том, что ресурсы на сервере не на пределе (скриншот внизу). Следовательно подвисает на блокировках. Насколько включение версионного режима поможет в этом случае (только конфигурационное изменение, не трогая никакого кода) и какие вообще подводные камни тут есть? Насколько понимаю Read Committed автоматически перестанет виснуть на блокировках, но слегка увеличится нагрузка на сервер из-за создания версий. Какие еще проблемы тут могут быть?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896013
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
У одного из клиентов при определенной наша база начинает тормозить, при том, что ресурсы на сервере не на пределе (скриншот внизу). Следовательно подвисает на блокировках


С чего вы взяли?
Может, у вас статистика там быстро устаревает?

Вам нужно сначала изучить вопрос и убедится в этих предположениях.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896016
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик

С чего вы взяли?
Может, у вас статистика там быстро устаревает?

Вам нужно сначала изучить вопрос и убедится в этих предположениях.

блокировки с высокой вероятностью, изучить что там именно не просто т.к. продакшн и это займет время. Поэтому если предположить что именно блокировки, то насколько включенная версионность поможет и насколько может повредить?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896024
Idol_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель,

вот уж с версионностью, я бы игрался в последнюю очередь на боевом сервере, без теста.

Копайте блокировки. Это более безопасно и более эффективно.
И в половине случаев можно решить индексами (может в паре с plan guide).

Кстати, в 99% процентах случаев, блокировки - это косяк дизайна программы/БД.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896025
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Idol_111

вот уж с версионностью, я бы игрался в последнюю очередь на боевом сервере, без теста.

а почему так? Что именно может сломаться? Я понимаю что починить блокировки правильнее, но это намного сложнее и не воспроизводится локально. Версионность выглядит как быстрый и безопасный способ починить, по крайней мере временно.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896029
Idol_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
Idol_111

вот уж с версионностью, я бы игрался в последнюю очередь на боевом сервере, без теста.

а почему так? Что именно может сломаться? Я понимаю что починить блокировки правильнее, но это намного сложнее и не воспроизводится локально. Версионность выглядит как быстрый и безопасный способ починить, по крайней мере временно.

Бизнес может сломаться. Правила же могут поменяться. Вы даете возможность читать грязные данные. Косяки не предсказуемы.
Это надо тестировать на глубоком уровне. Конечно, можно не париться если у вас программа типа 2+2, так блокировок бы не было в таком случая, я полагаю.

Ну погуглите что ли, на первой же странице по русски.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896031
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Idol_111

Бизнес может сломаться. Правила же могут поменяться. Вы даете возможность читать грязные данные. Косяки не предсказуемы.
Это надо тестировать на глубоком уровне. Конечно, можно не париться если у вас программа типа 2+2, так блокировок бы не было в таком случая, я полагаю.

Ну погуглите что ли, на первой же странице по русски.

не, это не верно, во первых мы очевидно не используем уровень Snapshot, а RC, который превратится в RCSI, так что с бизнесом проблем точно не будет. Интересуют есть-ли какие-то технические подводные камни, на которые можно напороться на практике.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896038
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
мы очевидно не используем уровень Snapshot, а RC, который превратится в RCSI, так что с бизнесом проблем точно не будет.
Превратится в READ_COMMITTED_SNAPSHOT? Разве это не означает, что читающая транзакция будет читать копию, вместо ожидания конца блокировки?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896046
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Превратится в READ_COMMITTED_SNAPSHOT? Разве это не означает, что читающая транзакция будет читать копию, вместо ожидания конца блокировки?

да, именно так. Но это-же не грязное чтение, плюс если строка залочена, это может быть из-за сканов итп, т.е. совсем не факт что конкретно эта строка вообще изменяется
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896050
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
alexeyvg
Превратится в READ_COMMITTED_SNAPSHOT? Разве это не означает, что читающая транзакция будет читать копию, вместо ожидания конца блокировки?

да, именно так. Но это-же не грязное чтение
Замечание Idol_111 было про изменение бизнес-логики.

Разработчики БД использовали уровень READ_COMMITTED для того, что бы при выборке данных подождать окончания транзакции, и не считывать данные до её завершения. А тут поведение меняется на чтение данных на момент до начала транзакции.

Наверное, это не должно привести к нарушениям, если система спроектирована правильно - нестрашно, что версия будет "до", главное, данные согласованы.
Но всё таки, бывают приложения, которые специально рассчитывают на то, что читающая транзакция будет ждать завершения записи. Например, лочат данные, и что то меняют снаружи (по отношению к сиквелу). То есть, обновление там используется как средство синхронизации, наподобие своего "sp_getapplock".
Кнюпель
плюс если строка залочена, это может быть из-за сканов итп, т.е. совсем не факт что конкретно эта строка вообще изменяется
Это вы совсем зря добавили :-)
"Авось эта строка на самом деле не изменится" - зачем это???
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896065
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель,

Надо не организационными мерами проблему решать, а брать SQL Profiler или Extended Events, делать трассировку и оптимизировать запросы. Если у вас блокировки, значит код так написан и его надо оптимизировать.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896083
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

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

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

alexeyvg
Это вы совсем зря добавили :-)
"Авось эта строка на самом деле не изменится" - зачем это???

как зачем, как раз имхо наиболее вероятный случай блокировок - когда нет нужного индекса и блокируется целоком таблица, в результате все висит хотя ничего из того, что требуется менятся и не собирается
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896084
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin

Надо не организационными мерами проблему решать, а брать SQL Profiler или Extended Events, делать трассировку и оптимизировать запросы. Если у вас блокировки, значит код так написан и его надо оптимизировать.

я все понимаю про то, как будет "правильно", но в данном топике интересует именно аспект когда включается версионность для борьбы с локами
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896103
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
У одного из клиентов при определенной наша база начинает тормозить, при том, что ресурсы на сервере не на пределе
При определенной что?
Если БД ведет себя нормально у всех и чудит у одного, то может там поселился любитель виртуализировать все подряд и дело вовсе не в БД и MSSQL.

Включение RCSI ничего не поломает в работе с данными. После включения можете на некоторое время получить просадку производительности, если есть большая активность по модификации данных.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896125
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то страхи нагоняют про RSCII, откуда там грязное чтение? Давно перевели всё на него и кроме понимания новой нагрузки на tempdb особо и нет ничего. Ну и да это уже дефолт уже как минимум дла азуры
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896138
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
a_voronin

Надо не организационными мерами проблему решать, а брать SQL Profiler или Extended Events, делать трассировку и оптимизировать запросы. Если у вас блокировки, значит код так написан и его надо оптимизировать.

я все понимаю про то, как будет "правильно", но в данном топике интересует именно аспект когда включается версионность для борьбы с локами


Вы будете ещё долго и безуспешно "танцевать бубном" вокруг вашего сервера, пока не займетесь оптимизацией.

Вы считаете, что разработали софт, а вы его "недоразработали".
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896141
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
alexeyvgЭто вы совсем зря добавили :-)
"Авось эта строка на самом деле не изменится" - зачем это???

как зачем, как раз имхо наиболее вероятный случай блокировок - когда нет нужного индекса и блокируется целоком таблица, в результате все висит хотя ничего из того, что требуется менятся и не собираетсяЭто я понимаю, но мы же говорим о вероятности нарушить бизнес-логику. И вы приводите аргумент в пользу того, что она не нарушится, т.к. "авось строка на самом деле не изменится, ведь в основном блокировки возникают из за сканов итп"
Аргумент "за невлияние на бизнес логику" плохой, несмотря на то, что подавляющее большинство строк на самом деле действительно не изменятся

Собственно, какой ещё ответ на ваш вопрос "Интересуют есть-ли какие-то технические подводные камни, на которые можно напороться на практике" может быть? Разумеется, абсолютно никаких проблем быть не может, кроме того, что всё перестанет работать :-)

Скорее всего, всё будет нормально, и блокировки уйдёт, но без тестирования я бы не рискнул.

И, разумеется, может быть просадка по производительности, ведь при изменениях нужно будет делать копию.

TaPaK
что-то страхи нагоняют про RSCII, откуда там грязное чтение? Давно перевели всё на него и кроме понимания новой нагрузки на tempdb особо и нет ничего.
Оно не грязное, но могут быть случаи, когда разработчики специально рассчитывают на блокировку.

TaPaK
Ну и да это уже дефолт уже как минимум дла азуры
Так нет вопросов, если система специально разрабатывается, тестируется, для снапшот изоляции.
Но просто перевести какую нибудь инсталляцию программы из 90-х я бы без тестирования не решился.
Ещё замечу, что такие изменения будут делаться вслепую, к серверам, на которых будут меняться настройки, у разработчиков доступа нет (как я понял, или, если есть, тестировать никто не будет, просто переключат на продакшене).
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896143
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель,

ой не слушайте :)


автораспект когда включается версионность для борьбы с локами
развести читателей и писателей. больше нет "аспектов"
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896149
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

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

что бы дедлоков было только больше? в остальных случаях они расчитывают на неё явно указывая, что никак не меняется в RCII
авторТак нет вопросов, если система специально разрабатывается, тестируется, для снапшот изоляции.
Но просто перевести какую нибудь инсталляцию программы из 90-х я бы без тестирования не решился.
звучит как рыжих мы сжигаем по привычке, а за что уже и не помним
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896151
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
что-то страхи нагоняют про RSCII, откуда там грязное чтение? Давно перевели всё на него и кроме понимания
новой нагрузки на tempdb особо и нет ничего. Ну и да это уже дефолт уже как минимум дла азуры


А Вы господа в курсе, что не все запросы совместимы между RC и RCSI ?

TC конечно хочет услышать про

Код: sql
1.
2.
3.
alter database snapshottest set allow_snapshot_isolation ON

alter database snapshottest set read_committed_snapshot ON 



И если он желает и дальше мучить клиента своей бд, то на этом и успокоиться.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896158
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,
авторА Вы господа в курсе, что не все запросы совместимы между RC и RCSI ?

например? Кроме явного SNAPSHOT со своими ограничениями так и не вспомню
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896165
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
a_voronin,
авторА Вы господа в курсе, что не все запросы совместимы между RC и RCSI ?

например? Кроме явного SNAPSHOT со своими ограничениями так и не вспомню

Одно из проблемных ограничений -- не работает DDL внутри транзакции. Например

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRAN 

SELECT * INTO #T FROM TT 

-- SOME CODE 

DROP TABLE #T 

-- SOME CODE 

COMMIT  
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896169
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
TaPaK
a_voronin,
пропущено...

например? Кроме явного SNAPSHOT со своими ограничениями так и не вспомню


Одно из проблемных ограничений -- не работает DDL внутри транзакции. Например

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRAN 

SELECT * INTO #T FROM TT 

-- SOME CODE 

DROP TABLE #T 

-- SOME CODE 

COMMIT  



что-что?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896176
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

попробуйте создать индекс на временной таблице внутри явной транзакции под RCSI

https://social.msdn.microsoft.com/Forums/officeocs/en-US/7969b924-4fb7-4bc6-9df3-9bf1163fc089/why-are-ddl-changes-to-a-temporary-table-not-allowed-within-a-snapshot-transaction?forum=sqldatabaseengine
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896180
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
TaPaK,

попробуйте создать индекс на временной таблице внутри явной транзакции под RCSI

https://social.msdn.microsoft.com/Forums/officeocs/en-US/7969b924-4fb7-4bc6-9df3-9bf1163fc089/why-are-ddl-changes-to-a-temporary-table-not-allowed-within-a-snapshot-transaction?forum=sqldatabaseengine

мм??
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRAN 

SELECT * INTO #T FROM sys.objects
CREATE INDEX ti_FACK ON #T (object_id)
-- SOME CODE 

DROP TABLE #T 

-- SOME CODE 

COMMIT  



скриншоты прилагать что-ли?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896184
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Код: sql
1.
2.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896185
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Дело было на 2014, может сейчас пофиксили?
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896186
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
TaPaK,

Код: sql
1.
2.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN


а всё таки мы не знаем что RCSII СОВСЕМ НЕ РАВНО SNAPSHOT
о чём в общем я и написал, что SNAPSHOT имеет ограничение, а вот при чём он здесь???

всё таки сжигаем рыжих по привычки, коллего :)
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896219
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Idol_111
Вы даете возможность читать грязные данные.

лажа какая-то.
RCSI всегда выдает последнюю закоммиченную версию.
в Азуре это вообще дефолт.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896226
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
RCSI всегда выдает последнюю закоммиченную версию


Не совсем.
Последнюю законченную до начала стейтмента.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896284
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Yasha123
RCSI всегда выдает последнюю закоммиченную версию


Не совсем.
Последнюю законченную до начала стейтмента.

я к тому, что ничего незакоммиченного, т.е. грязного, не даст.
а закоммичено ли на начало транзакции или на начало стэйтмента,
в данном контексте меняет мало, данные закоммичены
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896292
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
msLex
пропущено...


Не совсем.
Последнюю законченную до начала стейтмента.

я к тому, что ничего незакоммиченного, т.е. грязного, не даст.
а закоммичено ли на начало транзакции или на начало стэйтмента,
в данном контексте меняет мало, данные закоммичены


ну это да, не зря же он RC, хоть и SI
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896333
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,
ну вот некоторые же умудряются читать "грязные данные"
и виноват у них в этом RCSI
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896641
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
Idol_111

Бизнес может сломаться. Правила же могут поменяться. Вы даете возможность читать грязные данные. Косяки не предсказуемы.
Это надо тестировать на глубоком уровне. Конечно, можно не париться если у вас программа типа 2+2, так блокировок бы не было в таком случая, я полагаю.

Ну погуглите что ли, на первой же странице по русски.

не, это не верно, во первых мы очевидно не используем уровень Snapshot, а RC, который превратится в RCSI, так что с бизнесом проблем точно не будет. Интересуют есть-ли какие-то технические подводные камни, на которые можно напороться на практике.

Вот вам пример, когда RCSI ломает логику: списание денег со счета клиента в параллельных транзакциях.
Код: sql
1.
2.
3.
4.
5.
6.
if exists (select 0 from dbo.Accounts a where a.Id = @AccountId and a.Amount < @Amount)
  raiserror('Insufficient funds on account.');

update a set Amount -= @Amount
from dbo.Accounts a
where a.Id = @AccountId;

При обычном RC вторая транзакция будет ждать окончания первой. При включении RCSI обе пройдут нормально, но в каком состоянии окажется счет - хз: может оказаться отрицательным, а может получиться так, что списание из первой транзакции совсем исчезнет.

Я в свое время столкнулся с этим, и вылечил его, емнип, добавлением хинта READCOMMITTEDLOCK. Но! Сначала вам нужно проанализировать ваш код и идентифицировать места, в которых такое изменение поведения возможно. После чего думать, как это исправить.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896654
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael

Вот вам пример, когда RCSI ломает логику: списание денег со счета клиента в параллельных транзакциях.
Код: sql
1.
2.
3.
4.
5.
6.
if exists (select 0 from dbo.Accounts a where a.Id = @AccountId and a.Amount < @Amount)
  raiserror('Insufficient funds on account.');

update a set Amount -= @Amount
from dbo.Accounts a
where a.Id = @AccountId;

При обычном RC вторая транзакция будет ждать окончания первой. При включении RCSI обе пройдут нормально, но в каком состоянии окажется счет - хз: может оказаться отрицательным, а может получиться так, что списание из первой транзакции совсем исчезнет.

Я в свое время столкнулся с этим, и вылечил его, емнип, добавлением хинта READCOMMITTEDLOCK. Но! Сначала вам нужно проанализировать ваш код и идентифицировать места, в которых такое изменение поведения возможно. После чего думать, как это исправить.

насколько понимаю, ваше предположение неверно. При обычном RC вы точно также можете отправить аккаунт в минус если первая транзакция сделает свой if exists(), а затем вторая сделает его-же, select его не заблокирует и оба if exists() отработают, после чего отработают оба update. Сделать что вы хотите можно как раз хинтом UPDLOCK на select, который, как я понимаю, в RCSI будет вести себя точно так-же, как и в RC
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896803
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель,

Это пример из головы, реальный код был несколько сложнее. Там были доп. проверки, что состояние счета на момент if exists такое же, как и при update. При этом никаких хинтов не требовалось.
После включения RCSI начались проблемы - вторая транзакция начала отваливаться с ошибкой, вместо того, чтобы ждать. Я не знаю, что у вас за система, может вам это пофиг. Нам не было, поэтому я полез разбираться.

В общем случае, везде где у вас предполагается сериализованный доступ к данным, RCSI может подгадить, подсунув старую версию записи вместо того, чтобы встать на блокировку. А так-то да, штука отличная.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896809
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,

емнип, вторая транзакция должна свалиться с ошибкой "данные были изменены" при попытке фиксации. Обе читают, обеим достаточно, но кто успел раньше - тот и выиграл.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896812
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Ennor Tiegael,

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

Это про снапшот транзакция. При RCSI такого нет.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896893
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael

В общем случае, везде где у вас предполагается сериализованный доступ к данным, RCSI может подгадить, подсунув старую версию записи вместо того, чтобы встать на блокировку. А так-то да, штука отличная.

Я даже затрудняюсь придумать реалистичный сценарий, где это может произойти. Результаты любого select без хинта по определению нельзя использовать позднее в транзакции если требуется что-бы данные не изменились, поэтому нельзя надеятся на блокировку выставленную другим писателем в другой транзакции. А как только появляется хинт - поведение RCSI и RC становится идентичным
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39896934
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
Результаты любого select без хинта по определению нельзя использовать позднее в транзакции если требуется что-бы данные не изменились
Вы попробуйте это рассказать современным (да и не очень) БД-писателям - они на вас будут смотреть как на идиота.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39897028
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мнение об ужасности и пакостях от RCSI (с т.зр проблем в бизнес-логике) имхо сильно преувеличено
[Ааппликухи на] Oracle работает так по умолчанию уже десятилетиями и прекрасно себя чувствует.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39897033
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Вы попробуйте это рассказать современным (да и не очень) БД-писателям - они на вас будут смотреть как на идиота.

в Read Committed select не расставляет блокировки, их надо вручную ставить, поэтому никаких изменений от RCSI в плане логики я например не вижу
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39897177
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
в Read Committed select не расставляет блокировки

и именно поэтому до появления RCSI sql server назвали "блокировочником".
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39897506
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski
Мнение об ужасности и пакостях от RCSI (с т.зр проблем в бизнес-логике) имхо сильно преувеличено
[Ааппликухи на] Oracle работает так по умолчанию уже десятилетиями и прекрасно себя чувствует.


Glebanski,

не совсем так, насколько я знаю, пока хватает ОЗУ для хранения версий - все замечательно, но как только версии сбрасываются на диск - всё очень плохо. Иллюзии о безмятежности Оракл.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39897845
Очень лысый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слухи об ужасах многоверсионности, как обычно, сильно преувеличены.
Теперь по существу. Во-первых, для начала неплохо было бы провести расследование и выяснить, это всё же блокировки, или нет. Особой проблемы в этом не вижу, хоть это и прод.
Во-вторых здесь было начали правильно говорить, что некисло было бы для начала протестировать работу приложения, но потом всё скатилось в спор насчёт грязного чтения. Никакого грязного чтения при мультиверсионности, по крайней мере, по умолчанию не будет. Но логика работы всё же поменяется. Так, например, если некая транзакция начала менять некие данные, и не успела из закоммитить, то селект от другой транзакции будет ждать, пока отпустится блокировка, и прочитает актуальную версию данных. А в случае версионности вторая транзакция прочитает просто старую версию. И вот здесь надо решить, а это поведение оно вообще устраивает клиента и разработчиков? А не повлияет это каким-то образом на бизнес-логику софтины?
Ещё один момент это как эта хрень скажется на производительности и размерах tempdb. Тут вот не к ночи помянули Oracle. Так вот там на самом деле всё хорошо. Главное это следить, чтобы у UNDO сегмента было достаточно места, и хорошо бы его на быстрые диски положить. И чтобы оно параллельно ещё писалось/читалось. И в MS SQL, по наблюдениям, тоже всё неплохо. Надо только таким же образом следить за tempdb. Другое дело, что кривая апликуха может сожрать место в tempdb и нагрузить её, потому в архитектуре этот момент тоже должен учитываться.
...
Рейтинг: 0 / 0
Включить версионность для борьбы с блокировками
    #39898388
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень лысый
Но логика работы всё же поменяется. Так, например, если некая транзакция начала менять некие данные, и не успела из закоммитить, то селект от другой транзакции будет ждать, пока отпустится блокировка, и прочитает актуальную версию данных. А в случае версионности вторая транзакция прочитает просто старую версию. И вот здесь надо решить, а это поведение оно вообще устраивает клиента и разработчиков? А не повлияет это каким-то образом на бизнес-логику софтины?

как я уже написал сверху, я не могу придумать ни одной ситуации из реальной жизни где это было бы проблемой, в RC я не полагаюсь на блокировку писателем из другой транзакции, я ее сам заблокирую хинтом в самом начале, что-бы ее никто не изменил. В стандартном RC без хинтов запись вернется либо до того, как ее успела изменить другая транзакция, либо после (повисев на блоке), а какой вариант именно - непредсказуемо
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Включить версионность для борьбы с блокировками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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