Генератор последовательных чисел с использованием Entity Framework Core - PullRequest
0 голосов
/ 03 марта 2020

Я хотел бы создать собственный генератор идентификаторов (без использования идентификатора и без сохранения c):

У меня есть следующие действия с EF:

  1. Чтение : получить строку и прочитать поле счетчика
  2. Проверки : выполнить некоторые проверки, сгенерировать и увеличить счетчик
  3. Запись : обновить строку для будущего использования

Естественно, у нас не должно быть идентификатора дубликата!

Я начал с установки операции (чтение и запись) в транзакции _context.Database.BeginTransaction

  1. , но не уверены, каков соответствующий уровень изоляции?
    • Я прочитал, что Repeatable Read гарантирует, что данные чтения не могут быть обновлены с помощью сопутствующей транзакции, но как насчет сценария, когда: Tran1 Read 3, Tran2 Read 3, Tran1 Update до 4, Tran2 Update до 4 !!! Может ли обновление Tran1 быть выполнено, если да, как Tran2 мог прочитать новое значение после завершения Tran1?
    • Я также обнаружил, что: SERIALIZABLE делает обратное и блокирует все. В то время как READ COMMITTED снимает блокировки при чтении строки или по завершении инструкции в зависимости от блокировки, SERIALIZABLE снимает блокировки после фиксации транзакции. Это означает, что другая транзакция, которая хочет обновить данные, которые транзакция прочитала хотя бы один раз, или другая транзакция хочет прочитать данные, которые обновила транзакция, будет заблокирована, пока транзакция не будет зафиксирована.
  2. или я должен использовать механизм блокировки, чтобы запретить чтение данных для одновременного использования trans для создания неправильного идентификатора?

1 Ответ

0 голосов
/ 05 марта 2020

Я думаю, что SERIALIZABLE является безопасным уровнем изоляции для этого сценария, эти ссылки очень полезны:

  1. Заполните серверный столбец sql порядковым номером, не используя удостоверение личности

  2. Хороша ли изоляция моментального снимка

  3. Понимание уровней изоляции sql сервер

Возможно добавить IsolationLevel к DbContext.Database.BeginTransaction, как показано здесь:

  1. BeginTransaction с IsolationLevel в EF Core

Уровни изоляции:

Чтение совершено:

  • Невозможно прочитать ("while" обновление cuncurrent tran или) "если" изменения еще не зафиксированы => заблокировано и ждать
  • Может читать «когда» зафиксированные изменения
  • Невозможно обновить », когда« cuncurrent trans »читает => заблокировано и ждать
  • Может обновлять "когда" cuncurrent trans закончит чтение

Сериализуемый:

  • Блокирует канун во-вторых, снять блокировку после выполнения всей транзакции (зафиксировано, откат)
  • Невозможно прочитать, «если» данные были прочитаны одновременной передачей
  • Невозможно обновить «если» данные были прочитаны одновременный тран

повторяется:

  • Невозможно обновить "если" данные были прочитаны параллельным транс

ОБНОВЛЕНИЕ

Использование Serializable опасно, лучше использовать LOCK TABLE table IN ACCESS EXCLUSIVE MODE; как блокировку уровня таблицы , чтобы заблокировать всю таблицу, если необходимо, или FOR UPDATE в вашем выборе как блокировку уровня строки , чтобы заблокировать выбранные строки для обновления из другого выберите для обновления. Смотрите мой ответ здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...