powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уровень изоляции в транзакции
10 сообщений из 10, страница 1 из 1
Уровень изоляции в транзакции
    #39586996
unsafe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Я не знаток касаемо уровней изоляции. Если честно никогда их даже не использовал. Пользуемся на работе EF, и насколько я знаю он всегда выполняет запросы с помощью транзакций. По умолчанию, это уровень ReadCommited. Можно всегда переписать заявку на SQL вместо использования EF2SQL, но мне принципиально важно понять как точно не ошибиться с уровнем изоляции.
Задача с которой я столкнулся заключается в следующем:
Есть две таблицы, Passengers и Transfers. В таблице Transfers есть поле PassengersSeats, которое отвечает за максимально кол-во пассажиров. При попытке добавления нового пассажира, мы должны проверить равно ли текущее кол-во пассажиров закреплённое за трансфером со значением в поле PassengersSeats. Если это так, то надо увеличить значение в поле PassengersSeats, после чего добавить пассажира.
Выходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные.
Подскажите, какой уровень изоляции использовать.
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39586998
unsafe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587017
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unsafeВыходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные. repeatable read
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587057
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unsafe, в случае с иэф ваша задача ни как (зависит от реализации) с транзакциями не связана. Ищите по словам ef rowversion concurrency
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587138
unsafe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дедушка,
Я руководствовался следующей статьёй . У нас в рамках одной транзакции будут следующие запросы.
1) select * from Transfers where Id = @transfersId
2) select count(*) from passengers where Id = @transfersId
после чего вариант insert+update или только insert
3) insert into Passengers ...
||
3) update Transfers
set PassengerSeats = PassengerSeats + 1
where Id = @transfersId
4) insert into Passengers ...

Мне стало интересно, а в каком случае у нас будет максимальные уровень изоляции, то есть Serializable? Только если в рамках одной транзакции мы будем повторно запрашивать данные?

buser, Почему не связана? Если повысить уровень изоляции можно же избежать не консистентного чтения/записи
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587160
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unsafe,

я думаю, что вам нужен Serializable, т.к. другим процессам даже читать нельзя из колонки счетчика, пока не закончится операция. Так как они тоже захотят обновить счетчик. Потенциально такой архитектурой вы создали "бутылочное горлышко".
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587175
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов, а почему не снапшот?
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587176
unsafe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, Как вы считаете, как было бы лучше спроектировать?
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587206
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unsafeУ нас в рамках одной транзакции будут следующие запросы.
1) select * from Transfers where Id = @transfersId
2) select count(*) from passengers where Id = @transfersId
после чего вариант insert+update или только insert
3) insert into Passengers ...
||
3) update Transfers
set PassengerSeats = PassengerSeats + 1
where Id = @transfersId
4) insert into Passengers ...Если делать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin tran;

update t
 set
  PassengerSeats += case when t.PassengerSeats > c then 0 else 1 end
from
 Transfers t cross apply
 (select count(*) from Passengers where transfer_id = t.id) p(c)
where
 t.id = @transferid;

insert into Passengers ...

commit;

То можно обойтись read committed. Соответственно, удаление из Passengers должно быть реализовано по такому же принципу.
...
Рейтинг: 0 / 0
Уровень изоляции в транзакции
    #39587285
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmunsafeУ нас в рамках одной транзакции будут следующие запросы.
1) select * from Transfers where Id = @transfersId
2) select count(*) from passengers where Id = @transfersId
после чего вариант insert+update или только insert
3) insert into Passengers ...
||
3) update Transfers
set PassengerSeats = PassengerSeats + 1
where Id = @transfersId
4) insert into Passengers ...Если делать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin tran;

update t
 set
  PassengerSeats += case when t.PassengerSeats > c then 0 else 1 end
from
 Transfers t cross apply
 (select count(*) from Passengers where transfer_id = t.id) p(c)
where
 t.id = @transferid;

insert into Passengers ...

commit;

То можно обойтись read committed. Соответственно, удаление из Passengers должно быть реализовано по такому же принципу.

Если внимательно прочитать бред тредстартера:

1. Вставляем в Passengers
2. Обновляем PassengerSeats = (select count(*) from Passengers where transfer_id = t.id)
3. И не парим отсутствующий мозг.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уровень изоляции в транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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