powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / READ_COMMITTED_SNAPSHOT и конкурентная запись
19 сообщений из 19, страница 1 из 1
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677852
GLeBaTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
По-рекоммендации 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
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677853
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GLeBaTi,

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

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

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


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

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

Код C#

При Snapshot isolation level

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

Поизучайте пессимистические и оптимистические блокировки
...
Рейтинг: 0 / 0
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677896
GLeBaTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей АлексеевичВообще, 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
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677909
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, не так выразился. IL Snapshot поддерживается производителями СУБД в основном не для этого.
Добиться того, чего вы хотите, можно разными способами, а вот уменьшить конкуренцию за данные при использовании других уровней изоляции -- практически никакими другими.
...
Рейтинг: 0 / 0
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677914
churupaha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39677915
churupaha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ -- на клиенте посмотрите если ни одной строки не обновлено
@@rowcount
...
Рейтинг: 0 / 0
READ_COMMITTED_SNAPSHOT и конкурентная запись
    #39678047
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GLeBaTi,

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

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

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

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

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


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