|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов В снимке находятся версии только прочитанных страниц 2. Snapshot гарантирует согласованность по чтению на начало транзакции. Поэтому select и delete будут работать с одними и теми же строками. Вы видимо путаете с механизмы работы TIL snapshot и database snapshot. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:19 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
msLex, в справке указано: Изоляция SNAPSHOT указывает, что данные, считанные внутри транзакции, никогда не отразят изменений, сделанных другими одновременными транзакциями. Транзакция использует версии строк данных, существующих при начале транзакции . При чтении данных на них не устанавливаются блокировки, иными словами, транзакции SNAPSHOT не блокируют операции записи данных, выполняемые другими транзакциями. Транзакции, осуществляющие запись данных, не блокируют чтение данных транзакциями моментального снимка. То есть, если на начало транзакции у строки не было версии, то строка не считывается, так? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:32 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов msLex, ... То есть, если на начало транзакции у стоки не было версии, то строка не считывается, так? Нет, конечно. Если строка была изменена другим процессом, пока шла snapshot транзакция, то старая версия запишется в tempdb и будет храниться там, пока есть транзакции (snapshot, RC snapshot), которым она может потребоваться. Чтение этой строки в рамках snapshot транзакции будет происходить из tempdb. Если же строка не менялась с момента старта snapshot транзакции, то она будет вычитана из таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:40 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
msLex, а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:44 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:51 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов msLex, а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно. Они сразу добавляются в таблицу, но при этом у них, как и у всех строк, есть идентификатор версии (сквозной по всей БД) прям в таблице. Общий принцип при работе в Snapshot следующий Смотрим на запись в таблице, если текущая версия устраивает (идентификатор версии меньше, чем на момент старта транзакции), то берем его. Если нет, ищем подходящий в version store в tempdb. Если и там нет, строка для транзакции не существует ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 15:57 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Спасибо за пояснения! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 16:04 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Владислав Колосов 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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 16:18 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
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? нужно лишь вставить тоже, что и удалить. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 16:24 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
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? нужно лишь вставить тоже, что и удалить. Это к вопросу "а что происходит со строками, которые были добавлены после начала транзакции в другой транзакции? Про изменение всё достаточно очевидно." ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 16:59 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
a_voronin, Какие еще range-локи при snapshot-изоляции? Нафига они там? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 17:10 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Для включения уровня изоляции снимка надо включить соответствующую настройку базы. При этом все, без исключений, изменяющие данные запросы начнут выполнять запись в Tempdb, я правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2020, 18:01 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов Кажется, понял... Ваш вариант в первом сообщении не будет работать по той же причине, о которой вы написали ниже. Вам надо или блокировать таблицу в целом, или использовать snapshot или использовать output выражение для получения ключей, переписанных в историческую таблицу. Удаление производить по этой таблице ключей. почему это? У меня select с хинтом xlock и уровень serializable, этого достаточно что-бы гарантировать что остальные транзакции только на этот @typeId будут висеть, остальная таблица не будет блокирована ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 09:08 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
invm Да. К тому же на serializable может заблокироваться таблица, а не строки. Ок. А что остальные транзакции в таком случае видят? На момент когда записи скопировались в историю, но еще не удалились из исходной таблицы? Они увидят записи в обоих таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 09:10 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич a_voronin, Какие еще range-локи при snapshot-изоляции? Нафига они там? ТС не хочет, чтобы что-то вставлялось, когда он скидывает запись в History. Вот для этого нужен range-лок. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 09:11 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Кнюпель У меня select с хинтом xlock и уровень serializable, этого достаточно что-бы гарантировать что остальные транзакции только на этот @typeId будут висеть, остальная таблица не будет блокирована И xlock не нужен, просто serializable (или holdlock) достаточно для предотвращения вставое/изменений. Кнюпель А что остальные транзакции в таком случае видят? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 09:49 |
|
Заблокировать строки для архивации
|
|||
---|---|---|---|
#18+
Владислав Колосов Для включения уровня изоляции снимка надо включить соответствующую настройку базы. Владислав Колосов При этом все, без исключений, изменяющие данные запросы начнут выполнять запись в Tempdb, я правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2020, 09:52 |
|
|
start [/forum/topic.php?fid=46&msg=39963194&tid=1686063]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 293ms |
total: | 444ms |
0 / 0 |