Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / READ_COMMITTED_SNAPSHOT и конкурентная запись / 19 сообщений из 19, страница 1 из 1
23.07.2018, 17:59
    #39677852
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
Здравствуйте.
По-рекоммендации MS решил попробовать READ_COMMITTED_SNAPSHOT изоляцию.
Хочу посмотреть как она отрабатывает при одновременном UPDATE одной и той-же строки двумя транзакциями

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


Проверил через
Код: sql
1.
SELECT name, is_read_committed_snapshot_on from sys.databases


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

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


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

Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?
...
Рейтинг: 0 / 0
23.07.2018, 18:00
    #39677853
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

авторМожет я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?
не должна
...
Рейтинг: 0 / 0
23.07.2018, 18:04
    #39677855
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
TaPaKGLeBaTi,

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

Оо т.е. если у меня два потока меняют одни данные, то я даже не узнаю ничего?
Видимо только Snapshot isolation спасает от всех бед.
...
Рейтинг: 0 / 0
23.07.2018, 18:11
    #39677864
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi Тестирую:
создаю два потока, которые открывают ReadCommited транзакции и меняют имя у User1.
Транзакция 1 применяет свои изменения
Транзакция 2 просто закрывается без (Exception)
В профайлере никаких ошибок небыло.


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

Может я немного не понял и READ_COMMITTED_SNAPSHOT не должна давать исключение?
Может вы код покажете, которым тестируете? И текст исключения, который у вас там якобы должен быть?
...
Рейтинг: 0 / 0
23.07.2018, 18:21
    #39677874
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
Гавриленко Сергей Алексеевич,

Код C#

При Snapshot isolation level

При ReadCommited
...
Рейтинг: 0 / 0
23.07.2018, 18:44
    #39677885
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
Вообще, snapshot isolation сделали не для того, чтобы знать, что "два потока меняют одни данные", а немного для другого. Update conflict -- это на сдачу получилось.

Поизучайте пессимистические и оптимистические блокировки
...
Рейтинг: 0 / 0
23.07.2018, 19:04
    #39677896
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
Гавриленко Сергей АлексеевичВообще, snapshot isolation сделали не для того, чтобы знать, что "два потока меняют одни данные", а немного для другого.
Разве?
wikiIn 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 .
...
Рейтинг: 0 / 0
23.07.2018, 19:30
    #39677909
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
Хорошо, не так выразился. IL Snapshot поддерживается производителями СУБД в основном не для этого.
Добиться того, чего вы хотите, можно разными способами, а вот уменьшить конкуренцию за данные при использовании других уровней изоляции -- практически никакими другими.
...
Рейтинг: 0 / 0
23.07.2018, 19:40
    #39677914
churupaha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

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

Код: sql
1.
create table dbo.tbl(id int, a, b, c, d, __row_version rowversion);



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



при update/delete добавляйте в предикат and __row_version = @old_sys_version
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 примерно так работает...
...
Рейтинг: 0 / 0
23.07.2018, 19:42
    #39677915
churupaha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
+ -- на клиенте посмотрите если ни одной строки не обновлено
@@rowcount
...
Рейтинг: 0 / 0
24.07.2018, 08:49
    #39678047
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

RCSI сделан для развода читателей и писателей. При этом надо всегда огдлядываться на бизнес-логику, позволяет ли вам такой подход. Если нужно - поднимайте уровень изоляции для ваших изменений.
...
Рейтинг: 0 / 0
25.07.2018, 08:00
    #39678686
H5N1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTiОо т.е. если у меня два потока меняют одни данные, то я даже не узнаю ничего?
Видимо только Snapshot isolation спасает от всех бед.

главная фишка RCSI консистентный набор на момент старта query.
блокировочный RC же пихает в набор неконсистентную кашу, плюс читатели блокирует писателей, создавая угрозы дедлоков.
...
Рейтинг: 0 / 0
26.07.2018, 17:05
    #39679770
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
churupaha,
Действительно, можно же rowcount проверять...
Теперь у меня дилема появилась.
Я могу использовать Read_committed_shapshot и проверять rowcount, и могу использовать snapshot_isolation и ловить исключения.
Оба варианта используют temp_db и не накладывают блокировки. Что мне лучше выбрать?
...
Рейтинг: 0 / 0
26.07.2018, 17:19
    #39679778
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

Но учитывая, что у Read_committed_snapshot есть проблемы с фантомным чтением, то видимо один Snapshot_Isolation решает от всех бед.
...
Рейтинг: 0 / 0
26.07.2018, 17:21
    #39679779
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

откуда вы всё это генерируете?
...
Рейтинг: 0 / 0
26.07.2018, 17:23
    #39679781
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
TaPaK,
Запросы? Из EntityFramework
...
Рейтинг: 0 / 0
26.07.2018, 17:34
    #39679787
GLeBaTi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
TaPaK,
(не редактируются тут комментарии...)
У меня в системе есть куча сервисов, которые параллельно изменяют некоторые параметры у пользователя. Надо сделать, чтобы не было ошибок. Вот и ломаю голову.
...
Рейтинг: 0 / 0
26.07.2018, 17:43
    #39679794
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTiTaPaK,
(не редактируются тут комментарии...)
У меня в системе есть куча сервисов, которые параллельно изменяют некоторые параметры у пользователя. Надо сделать, чтобы не было ошибок. Вот и ломаю голову.
для этого достаточно управлять изоляцией конкретных действий, а не всего сервера
...
Рейтинг: 0 / 0
26.07.2018, 21:34
    #39679899
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
READ_COMMITTED_SNAPSHOT и конкурентная запись
GLeBaTi,

для такого сценария можно использовать InMemоry таблицы, не изменяя уровень изоляции.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / READ_COMMITTED_SNAPSHOT и конкурентная запись / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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