Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уровень изоляции в транзакции / 10 сообщений из 10, страница 1 из 1
19.01.2018, 12:43
    #39586996
unsafe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
Привет.
Я не знаток касаемо уровней изоляции. Если честно никогда их даже не использовал. Пользуемся на работе EF, и насколько я знаю он всегда выполняет запросы с помощью транзакций. По умолчанию, это уровень ReadCommited. Можно всегда переписать заявку на SQL вместо использования EF2SQL, но мне принципиально важно понять как точно не ошибиться с уровнем изоляции.
Задача с которой я столкнулся заключается в следующем:
Есть две таблицы, Passengers и Transfers. В таблице Transfers есть поле PassengersSeats, которое отвечает за максимально кол-во пассажиров. При попытке добавления нового пассажира, мы должны проверить равно ли текущее кол-во пассажиров закреплённое за трансфером со значением в поле PassengersSeats. Если это так, то надо увеличить значение в поле PassengersSeats, после чего добавить пассажира.
Выходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные.
Подскажите, какой уровень изоляции использовать.
...
Рейтинг: 0 / 0
19.01.2018, 12:44
    #39586998
unsafe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
...
Рейтинг: 0 / 0
19.01.2018, 13:01
    #39587017
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
unsafeВыходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные. repeatable read
...
Рейтинг: 0 / 0
19.01.2018, 13:38
    #39587057
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
unsafe, в случае с иэф ваша задача ни как (зависит от реализации) с транзакциями не связана. Ищите по словам ef rowversion concurrency
...
Рейтинг: 0 / 0
19.01.2018, 14:56
    #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
19.01.2018, 15:22
    #39587160
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
unsafe,

я думаю, что вам нужен Serializable, т.к. другим процессам даже читать нельзя из колонки счетчика, пока не закончится операция. Так как они тоже захотят обновить счетчик. Потенциально такой архитектурой вы создали "бутылочное горлышко".
...
Рейтинг: 0 / 0
19.01.2018, 15:34
    #39587175
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
Владислав Колосов, а почему не снапшот?
...
Рейтинг: 0 / 0
19.01.2018, 15:37
    #39587176
unsafe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уровень изоляции в транзакции
Владислав Колосов, Как вы считаете, как было бы лучше спроектировать?
...
Рейтинг: 0 / 0
19.01.2018, 16:14
    #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
19.01.2018, 17:56
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уровень изоляции в транзакции / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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