powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать строки для архивации
18 сообщений из 43, страница 2 из 2
Заблокировать строки для архивации
    #39962859
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
В снимке находятся версии только прочитанных страниц
1. В tempdb хранятся версии строк, а не страниц.
2. Snapshot гарантирует согласованность по чтению на начало транзакции. Поэтому select и delete будут работать с одними и теми же строками.

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

в справке указано:
Изоляция SNAPSHOT указывает, что данные, считанные внутри транзакции, никогда не отразят изменений, сделанных другими одновременными транзакциями. Транзакция использует версии строк данных, существующих при начале транзакции . При чтении данных на них не устанавливаются блокировки, иными словами, транзакции SNAPSHOT не блокируют операции записи данных, выполняемые другими транзакциями. Транзакции, осуществляющие запись данных, не блокируют чтение данных транзакциями моментального снимка.

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

...

То есть, если на начало транзакции у стоки не было версии, то строка не считывается, так?

Нет, конечно.


Если строка была изменена другим процессом, пока шла snapshot транзакция, то старая версия запишется в tempdb и будет храниться там, пока есть транзакции (snapshot, RC snapshot), которым она может потребоваться.
Чтение этой строки в рамках snapshot транзакции будет происходить из tempdb.
Если же строка не менялась с момента старта snapshot транзакции, то она будет вычитана из таблицы.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962882
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962890
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
msLex,

а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно.


https://docs.microsoft.com/ru-ru/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server It will not see new rows inserted after the transaction was started because those sequence number values will be higher than the value of the transaction sequence number.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962894
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
msLex,

а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно.

Они сразу добавляются в таблицу, но при этом у них, как и у всех строк, есть идентификатор версии (сквозной по всей БД) прям в таблице.

Общий принцип при работе в Snapshot следующий

Смотрим на запись в таблице, если текущая версия устраивает (идентификатор версии меньше, чем на момент старта транзакции), то берем его.
Если нет, ищем подходящий в version store в tempdb.
Если и там нет, строка для транзакции не существует
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962900
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за пояснения!
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962914
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Владислав Колосов
msLex,

а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно.


https://docs.microsoft.com/ru-ru/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server It will not see new rows inserted after the transaction was started because those sequence number values will be higher than the value of the transaction sequence number.


Вот здесь есть смысл вспомнить про serializable, потому что только он умеет накладывать key-range lock

https://aboutsqlserver.com/2016/10/11/locking-in-microsoft-sql-server-part-20-range-lock-ranges-u-deadlock-due-to-ignore_dup_key-index-option/
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962921
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Гавриленко Сергей Алексеевич
пропущено...


пропущено...


Вот здесь есть смысл вспомнить про serializable, потому что только он умеет накладывать key-range lock

https://aboutsqlserver.com/2016/10/11/locking-in-microsoft-sql-server-part-20-range-lock-ranges-u-deadlock-due-to-ignore_dup_key-index-option/

а зачем тут key-range lock?
нужно лишь вставить тоже, что и удалить.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962941
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
a_voronin
пропущено...


Вот здесь есть смысл вспомнить про serializable, потому что только он умеет накладывать key-range lock

https://aboutsqlserver.com/2016/10/11/locking-in-microsoft-sql-server-part-20-range-lock-ranges-u-deadlock-due-to-ignore_dup_key-index-option/

а зачем тут key-range lock?
нужно лишь вставить тоже, что и удалить.


Это к вопросу "а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно."
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962953
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Какие еще range-локи при snapshot-изоляции? Нафига они там?
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39962974
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для включения уровня изоляции снимка надо включить соответствующую настройку базы. При этом все, без исключений, изменяющие данные запросы начнут выполнять запись в Tempdb, я правильно понимаю?
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963179
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов

Кажется, понял... Ваш вариант в первом сообщении не будет работать по той же причине, о которой вы написали ниже. Вам надо или блокировать таблицу в целом, или использовать snapshot или использовать output выражение для получения ключей, переписанных в историческую таблицу. Удаление производить по этой таблице ключей.

почему это? У меня select с хинтом xlock и уровень serializable, этого достаточно что-бы гарантировать что остальные транзакции только на этот @typeId будут висеть, остальная таблица не будет блокирована
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963183
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Да.
К тому же на serializable может заблокироваться таблица, а не строки.

Ок. А что остальные транзакции в таком случае видят? На момент когда записи скопировались в историю, но еще не удалились из исходной таблицы? Они увидят записи в обоих таблицах?
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963184
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
a_voronin,

Какие еще range-локи при snapshot-изоляции? Нафига они там?


ТС не хочет, чтобы что-то вставлялось, когда он скидывает запись в History. Вот для этого нужен range-лок.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963194
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнюпель
У меня select с хинтом xlock и уровень serializable, этого достаточно что-бы гарантировать что остальные транзакции только на этот @typeId будут висеть, остальная таблица не будет блокирована
Как уже говорилось, это не гарантированно. Заблокирована может быть вся таблица.
И xlock не нужен, просто serializable (или holdlock) достаточно для предотвращения вставое/изменений.
Кнюпель
А что остальные транзакции в таком случае видят?
Само-собой ничего. Будут ждать.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963197
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Для включения уровня изоляции снимка надо включить соответствующую настройку базы.
Надо.
Владислав Колосов
При этом все, без исключений, изменяющие данные запросы начнут выполнять запись в Tempdb, я правильно понимаю?
Если изменяющие это update/delete, то да.
...
Рейтинг: 0 / 0
Заблокировать строки для архивации
    #39963201
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
ТС не хочет, чтобы что-то вставлялось, когда он скидывает запись в History. Вот для этого нужен range-лок.
Мы как бы в курсе, что такое range-локи.
Вас спросили для чего они при snapshot'е.
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать строки для архивации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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