Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
Привет. Я не знаток касаемо уровней изоляции. Если честно никогда их даже не использовал. Пользуемся на работе EF, и насколько я знаю он всегда выполняет запросы с помощью транзакций. По умолчанию, это уровень ReadCommited. Можно всегда переписать заявку на SQL вместо использования EF2SQL, но мне принципиально важно понять как точно не ошибиться с уровнем изоляции. Задача с которой я столкнулся заключается в следующем: Есть две таблицы, Passengers и Transfers. В таблице Transfers есть поле PassengersSeats, которое отвечает за максимально кол-во пассажиров. При попытке добавления нового пассажира, мы должны проверить равно ли текущее кол-во пассажиров закреплённое за трансфером со значением в поле PassengersSeats. Если это так, то надо увеличить значение в поле PassengersSeats, после чего добавить пассажира. Выходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные. Подскажите, какой уровень изоляции использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 12:43 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
unsafeВыходит мы должны синхронизировать чтение из таблицы Passengers, что бы при попытке посчитать текущее кол-во пассажиров мы не получили неверные данные. repeatable read ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 13:01 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
unsafe, в случае с иэф ваша задача ни как (зависит от реализации) с транзакциями не связана. Ищите по словам ef rowversion concurrency ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 13:38 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
Дедушка, Я руководствовался следующей статьёй . У нас в рамках одной транзакции будут следующие запросы. 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, Почему не связана? Если повысить уровень изоляции можно же избежать не консистентного чтения/записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 14:56 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
unsafe, я думаю, что вам нужен Serializable, т.к. другим процессам даже читать нельзя из колонки счетчика, пока не закончится операция. Так как они тоже захотят обновить счетчик. Потенциально такой архитектурой вы создали "бутылочное горлышко". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 15:22 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, а почему не снапшот? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 15:34 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, Как вы считаете, как было бы лучше спроектировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 15:37 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
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. То можно обойтись read committed. Соответственно, удаление из Passengers должно быть реализовано по такому же принципу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 16:14 |
|
||
|
Уровень изоляции в транзакции
|
|||
|---|---|---|---|
|
#18+
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. То можно обойтись read committed. Соответственно, удаление из Passengers должно быть реализовано по такому же принципу. Если внимательно прочитать бред тредстартера: 1. Вставляем в Passengers 2. Обновляем PassengerSeats = (select count(*) from Passengers where transfer_id = t.id) 3. И не парим отсутствующий мозг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2018, 17:56 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39587206&tid=1690468]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 347ms |

| 0 / 0 |
