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

Откуда:
Сообщений: 22
Здравствуйте.
По-рекоммендации MS решил попробовать READ_COMMITTED_SNAPSHOT изоляцию.
Хочу посмотреть как она отрабатывает при одновременном UPDATE одной и той-же строки двумя транзакциями

Включил в бд этот режим:
ALTER DATABASE TestDb SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

Проверил через
SELECT name, is_read_committed_snapshot_on from sys.databases

Единичка выставилась.

Тестирую:
создаю два потока, которые открывают ReadCommited транзакции и меняют имя у User1.
Транзакция 1 применяет свои изменения
Транзакция 2 просто закрывается без (Exception)
В профайлере никаких ошибок небыло.


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

Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?
23 июл 18, 17:59    [21595183]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
TaPaK
Member

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

автор
Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?

не должна
23 июл 18, 18:00    [21595185]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
TaPaK
GLeBaTi,

автор
Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?

не должна


Оо т.е. если у меня два потока меняют одни данные, то я даже не узнаю ничего?
Видимо только Snapshot isolation спасает от всех бед.
23 июл 18, 18:04    [21595199]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
GLeBaTi
Тестирую:
создаю два потока, которые открывают ReadCommited транзакции и меняют имя у User1.
Транзакция 1 применяет свои изменения
Транзакция 2 просто закрывается без (Exception)
В профайлере никаких ошибок небыло.


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

Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?

Может вы код покажете, которым тестируете? И текст исключения, который у вас там якобы должен быть?
23 июл 18, 18:11    [21595227]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
Гавриленко Сергей Алексеевич,

Код C#

При Snapshot isolation level

При ReadCommited

Сообщение было отредактировано: 23 июл 18, 18:32
23 июл 18, 18:21    [21595262]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
Вообще, snapshot isolation сделали не для того, чтобы знать, что "два потока меняют одни данные", а немного для другого. Update conflict -- это на сдачу получилось.

Поизучайте пессимистические и оптимистические блокировки

Сообщение было отредактировано: 23 июл 18, 18:49
23 июл 18, 18:44    [21595334]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
Гавриленко Сергей Алексеевич
Вообще, snapshot isolation сделали не для того, чтобы знать, что "два потока меняют одни данные", а немного для другого.

Разве?
wiki
In databases, and transaction processing (transaction management), snapshot isolation is a guarantee that all reads made in a transaction will see a consistent snapshot of the database (in practice it reads the last committed values that existed at the time it started), and the transaction itself will successfully commit only if no updates it has made conflict with any concurrent updates made since that snapshot.
23 июл 18, 19:04    [21595387]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
Хорошо, не так выразился. IL Snapshot поддерживается производителями СУБД в основном не для этого.
Добиться того, чего вы хотите, можно разными способами, а вот уменьшить конкуренцию за данные при использовании других уровней изоляции -- практически никакими другими.

Сообщение было отредактировано: 23 июл 18, 19:34
23 июл 18, 19:30    [21595442]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
GLeBaTi,

можно и на "низких" уровнях изоляции, в таблицу(ы) добавьте колонку __row_version rowversion

create table dbo.tbl(id int, a, b, c, d, __row_version rowversion);


вместе со строкой при выборке на клиента выбирайте и значение __row_version
select id, a, b, __row_version from dbo.tbl;


при update/delete добавляйте в предикат and __row_version = @old_sys_version
begin transaction;

update dbo.tbl set a = @a, b = @b where id = @id and __row_version = @old_sys_version

-- заберите новое значение версии на клиента
select @new_sys_version = ...;

commit transaction;

-- на клиенте посмотрите если ни одной строки не обновлено, то значит, ее кто-то изменил до вас, 
-- перечитывайте просто по id и можно предложить пользователю merge интерфейс


EF примерно так работает...
23 июл 18, 19:40    [21595455]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ -- на клиенте посмотрите если ни одной строки не обновлено
@@rowcount
23 июл 18, 19:42    [21595459]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
TaPaK
Member

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

RCSI сделан для развода читателей и писателей. При этом надо всегда огдлядываться на бизнес-логику, позволяет ли вам такой подход. Если нужно - поднимайте уровень изоляции для ваших изменений.
24 июл 18, 08:49    [21596342]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
H5N1
Member

Откуда: Yo.! из "Сравнения субд"
Сообщений: 327
GLeBaTi
Оо т.е. если у меня два потока меняют одни данные, то я даже не узнаю ничего?
Видимо только Snapshot isolation спасает от всех бед.


главная фишка RCSI консистентный набор на момент старта query.
блокировочный RC же пихает в набор неконсистентную кашу, плюс читатели блокирует писателей, создавая угрозы дедлоков.
25 июл 18, 08:00    [21600086]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
churupaha,
Действительно, можно же rowcount проверять...
Теперь у меня дилема появилась.
Я могу использовать Read_committed_shapshot и проверять rowcount, и могу использовать snapshot_isolation и ловить исключения.
Оба варианта используют temp_db и не накладывают блокировки. Что мне лучше выбрать?
26 июл 18, 17:05    [21605351]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
GLeBaTi,

Но учитывая, что у Read_committed_snapshot есть проблемы с фантомным чтением, то видимо один Snapshot_Isolation решает от всех бед.
26 июл 18, 17:19    [21605412]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
TaPaK
Member

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

откуда вы всё это генерируете?
26 июл 18, 17:21    [21605423]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
TaPaK,
Запросы? Из EntityFramework
26 июл 18, 17:23    [21605438]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
GLeBaTi
Member

Откуда:
Сообщений: 22
TaPaK,
(не редактируются тут комментарии...)
У меня в системе есть куча сервисов, которые параллельно изменяют некоторые параметры у пользователя. Надо сделать, чтобы не было ошибок. Вот и ломаю голову.
26 июл 18, 17:34    [21605502]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
GLeBaTi
TaPaK,
(не редактируются тут комментарии...)
У меня в системе есть куча сервисов, которые параллельно изменяют некоторые параметры у пользователя. Надо сделать, чтобы не было ошибок. Вот и ломаю голову.

для этого достаточно управлять изоляцией конкретных действий, а не всего сервера
26 июл 18, 17:43    [21605555]     Ответить | Цитировать Сообщить модератору
 Re: READ_COMMITTED_SNAPSHOT и конкурентная запись  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
GLeBaTi,

для такого сценария можно использовать InMemоry таблицы, не изменяя уровень изоляции.
26 июл 18, 21:34    [21606281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить