Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопросы по read committed snapshot  [new]
ovle
Member

Откуда:
Сообщений: 4
Здравствуйте. Читаю MDSN https://msdn.microsoft.com/ru-ru/library/tcbchxcb(v=vs.110).aspx
Если включен уровень изоляции SNAPSHOT, то при обновлении каждой строки компонент SQL Server Database Engine сохраняет копию исходной строки в базе данных tempdb и добавляет в строку порядковый номер транзакции.

Собственно вопросы - если 10 разных транзакций изменили одну и ту же строку, то в tempdb будет сохранено 10 версий? Когда старые версии будут очищены? Есть ещё какие либо преимущества RCSI кроме увеличения параллелизма за счет версионирования?
11 янв 16, 09:41    [18660939]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
ovle
Собственно вопросы - если 10 разных транзакций изменили одну и ту же строку, то в tempdb будет сохранено 10 версий?
Да.
ovle
Когда старые версии будут очищены?
При завершении транзакции.
ovle
Есть ещё какие либо преимущества RCSI кроме увеличения параллелизма за счет версионирования?
Нет. Ну и производительность может вырасти за счёт того, что нет необходимости управлять блокировками. Но может и понизиться, за счёт того, что есть необходимость делать копии изменённых данных в темпдб.
11 янв 16, 10:02    [18660997]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
.

Собственно вопросы - если 10 разных транзакций изменили одну и ту же строку, то в tempdb будет сохранено 10 версий?

да.


Когда старые версии будут очищены?

когда закончятся эти транзакции. успешно или неспешно.

Есть ещё какие либо преимущества RCSI кроме увеличения параллелизма за счет версионирования?


это - главное. на самом деле это очень кардинально преимущество, и для некоторых приложений оно критически важное.
11 янв 16, 12:07    [18661500]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ovle
Когда старые версии будут очищены?
https://technet.microsoft.com/en-us/library/hh696890(v=exchg.80).aspx
The cleanup of Version Store entries is performed by an asynchronous background thread. As transactions commit or roll back, this asynchronous background thread cleans up the version store entries that are older than the oldest of the remaining active transactions.
Важно - "oldest of the remaining active transactions" следует понимать как наиболее старая транзакция в пределах всего экземпляра, а не какой-то БД.
11 янв 16, 12:49    [18661722]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
execute
Guest
alexeyvg
ovle
Собственно вопросы - если 10 разных транзакций изменили одну и ту же строку, то в tempdb будет сохранено 10 версий?
Да.


Непонятно что вы имеете ввиду.
create database testSI
go

alter database testSI set read_committed_snapshot on
go
alter database testSI set allow_snapshot_isolation on
go

use testSI

create table dbo.t ( i int ) 
go
insert into dbo.t select 1;
go

set transaction isolation level snapshot
go

begin tran
  update dbo.t
  set i = 11
  where i = 1;


В другой сессии:
use testSI;

set transaction isolation level snapshot
go

begin tran
  
  -- i = 1
  select * from dbo.t

  update dbo.t
  set i = 111
  where i = 1;


Вторая сессия заблокирована первой.

Вопрос: Как 10 разных транзакций могут менять одну и ту же строку?
19 дек 16, 18:01    [20023788]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
execute,

автор
Вопрос: Как 10 разных транзакций могут менять одну и ту же строку?

ROWVERSION

зачем при
автор
alter database testSI set allow_snapshot_isolation on

делать
автор
set transaction isolation level snapshot
19 дек 16, 18:07    [20023817]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
точнее это иногда надо, но с пониманием зачем :)
19 дек 16, 18:23    [20023893]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
Х
Guest
[quot TaPaK]execute,

автор
Вопрос: Как 10 разных транзакций могут менять одну и ту же строку?

ROWVERSION

Как 10 разных транзакций могут менять одну и ту же строку если монопольные блокировки несовместимы между собой?
19 дек 16, 19:31    [20024231]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Х
Как 10 разных транзакций могут менять одну и ту же строку если монопольные блокировки несовместимы между собой?
Никак. Поэтому все менятели выстроятся в очередь.
19 дек 16, 19:40    [20024266]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
execute
Guest
invm,

Кажется понятно, что имел ввиду ТС и что вы имеете ввиду.
Если 10 разных транзакций меняют строку ( последовательно ), но в этом же время есть куча читателей - эти читатели берут те версии строк, которые были действующими на момент начала транзакции читателя. В высоконагруженной системе таких версий строк может быть куча.

Еще вопрос есть - все вышесказанное относится только к SI?
Если я правильно понимаю, в RCSI цепочки версий строк нет, а есть только одно, предыдущее, значение строки в tempdb.
20 дек 16, 07:42    [20025351]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
execute,

автор
Еще вопрос есть - все вышесказанное относится только к SI?
Если я правильно понимаю, в RCSI цепочки версий строк нет, а есть только одно, предыдущее, значение строки в tempdb.

да всё так, только наоборот :)
20 дек 16, 07:55    [20025362]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 346
Помогите пожалуйста прояснить следующее :
В Oracle - е так :
Допустим есть запрос на выбор данных (select), который выполняется 10 сек
----0---------------10-->t
Другая сессия примерно в это же время изменяет некоторые строки этого запроса (транзакция длится с 5 до 9 сек по отношению к первой сессии) :
-----------5-------9---->t

Запрос из первой сессии измененные строки подтащит из сегмента отката (т.е. вернет данные, которые были на момент запуска select - не важно изменялись ли строки в момент выполнения или нет).

В MS SQL server ,при изоляции моментального снимка, такое допустимо ?
20 дек 16, 08:49    [20025459]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
o-o
Guest
При использовании RCSI вы будете читать закомиченные консистентные данные на момент начала селекта, т.е. вам выдадут версии строк до начала изменения.
При чтении на уровне SNAPSHOT вы будете получать закомиченные консистентные данные в течение всей транзакции, не только одного стэйтмента. Во втором случае, если вы сперва прочтете данные, затем их изменит другая транзакция, и вы все в той же транзакции попытаетесь эти данные изменить, получите ошибку типа оракловой snapshot is too old
20 дек 16, 09:15    [20025525]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
execute
Guest
o-o
При использовании RCSI вы будете читать закомиченные консистентные данные на момент начала селекта, т.е. вам выдадут версии строк до начала изменения.

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

Но я все еще не понял про "цепочку версий строк".
В SNAPSHOT, очевидно, может быть цепочка для каждой измененной строки.

А в RCSI есть такие цепочки? Зачем там держать много версий строки, если писатели лочат друг друга, читатели смотрят всегда на незакоммиченное значение, а как только оно становится закоммиченным - сразу смотрят на него.
20 дек 16, 09:56    [20025647]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
execute,

омг. в SNAPSHOT не используется rowversion, только в RSCI. o-o нормально всё написал, что ж ещё
20 дек 16, 09:59    [20025661]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
execute
Guest
TaPaK
execute,

омг. в SNAPSHOT не используется rowversion


Пример:

Время_1: Транзакция_1 с включенным SNAPSHOT читает строку из условной таблицы dbo.t2
Время_2: Транзакция_2 изменяет эту строку в dbo.t2 и коммитится
Время_3: Транзакция_3 с включенным SNAPSHOT читает строку из dbo.t2

Транзакция_1:
--drop table dbo.t2
create table dbo.t2( i int ) 
insert into dbo.t2 select 1
go
set transaction isolation level snapshot
go

begin tran

	select * from dbo.t2

	--------------------

	select * from dbo.t2

Транзакция_2:
update dbo.t2 set i = 2;

Транзакция_3:
set transaction isolation level snapshot
go

begin tran

	select * from dbo.t2
        --------------------
	select * from dbo.t2


Еще раз Транзакция_2:
update dbo.t2 set i = 3;

Транзакция_1 так и будет читать 1.
Транзакция_3 читает 2

Закомиченное значение = 3

Что это, если не версионность?

select snapshot_isolation_state, is_read_committed_snapshot_on from sys.databases where name = db_name()

snapshot_isolation_state = 1
is_read_committed_snapshot_on = 0
20 дек 16, 10:22    [20025739]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
o-o
Guest
execute
Насколько я понимаю, после того, как изменение пройдет, все транзакции-читатели ( неважно когда они начались ) будут читать измененные данные.


Всем наплевать на то, прошло изменение или не прошло, транзакция в случае snapshot или стэйтмент в случае RCSI начинается в момент t1 и на всем протяжении транзакции /стэйтмента вы будете читать строки на момент их состояния t1, или на момент t0 < t1, если в момент t1 уже шла модификация данных.
Пусть вы открыли транзакцию в 12 дня и используете уровень snapshot. Открыли и ушли на обед.
Вернулись через 2 часа, у вас в коде begin tran без commit, вы снова селектите то, что читали 2 часа назад, вам снова вернут то же самое.
А пока вы кушали, эти строки вообще удалили из таблицы. Но вам их нравится перечитывать, вы не закрываете транзакцию и до ужина перечитываете то, чего уже давно нет. В 19 часов делаете commit.
Вот теперь все тот же селект выдаст вам 0 строк, и не раньше.
[/quot]
20 дек 16, 10:26    [20025756]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
execute,
медленно - снимок на всю транзакцию
При чтении на уровне SNAPSHOT вы будете получать закомиченные консистентные данные в течение всей транзакции
RSCI снимок строки на каждый стейтмент. компренде?
20 дек 16, 10:27    [20025762]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
o-o
Guest
TaPaK
в SNAPSHOT не используется rowversion

чего это не используется, когда все то же самое?
меняется только время жизни версий,
при RCSI версии хранятся, пока жив самый ранний стэйтмент,
обращающийся к данной версии,
при SNAPSHOT -- пока открыта транзакция
20 дек 16, 10:40    [20025842]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
o-o,

несомненно, снимок то должен быть какой-то версией, но для понимания проще рассматривать не версию строк для snapshot а снимок на начала транзакции и всё, для rcsi как раз всё упирается в множественный rowversion
20 дек 16, 10:52    [20025928]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
o-o
Guest
execute
Зачем там держать много версий строки, если писатели лочат друг друга, читатели смотрят всегда на незакоммиченное значение, а как только оно становится закоммиченным - сразу смотрят на него.

да с чего вы взяли-то, что читатели незакоммиченное видят?
как раз всегда только закоммиченное.
последнее закоммиченное на момент начала стэйтмента/транзакции
----
а зачем нужны цепочки даже на RCSI ?
затем, что не только вы читаете.
имеем традиционную таблицу в 400Гиг с нтекстом, чтение этого добра полностью длится минимум час.
прошла информация, что кто-то чего-то напутал с новогодней акцией,
поэтому в 10 утра Петя (Ч1) начинает читать все 400 гиг на предмет поиска строки, содержащей
"распродано по супер-пупер цене, равной 1% от обычного ценника".
в это время друг-айтишник перепутавшей все продавчихи Люды решает замести следы,
но ему не повезло, он начал апдэйтить эти записи в 10:02.
сервер видит, что селект Пети начался в 10:00, поэтому все строки, изменяемые другом-айтишником (А1),
сохраняются в их виде на момент 10 утра.
Люда продала 500 товаров не по той цене,
А1 знал номера заказов и быстренько подменил там имя продавчихи, уже в 10:05
все было сделано, но Ч1 все 500 строк с правильным именем получит, т.к. читает версии.
10:05 : айтишник переправил все имена с Люды на Олю,
а Оля это подруга другого айтишника А2.
он об этом узнает и в 10:10 начинает переправлять Олю на бабу Дусю, в 10:15 все переправлено.
так вот, если в момент 10:08 кто-то еще начал чтение (Ч2) того же самого,
он прочтет, что неправильно распродала все Оля,
а не Люда, и не баба Дуся.
потому что на момент 10:08 закоммиченные данные показывают Олю.
и наплевать, что чтение окончится только лишь в 11.
то, что в 10:15 станет бабой Дусей, никак не будет получено чтецом Ч2, и уж тем более чтецом Ч1.
так понятнее?
20 дек 16, 11:31    [20026170]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
execute
Guest
o-o
при RCSI версии хранятся, пока жив самый ранний стэйтмент, обращающийся к данной версии

Вот этот момент я не учел.
Теперь все стало на свои места. Спасибо! Ну и последний пример не лишний :)

TaRaK, вам тоже спасибо.
20 дек 16, 13:39    [20026897]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы по read committed snapshot  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
execute,

https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/
симпатичная статья с шариками :)
20 дек 16, 13:43    [20026927]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить