Я хотел бы создать собственный генератор идентификаторов (без использования идентификатора и без сохранения c):
У меня есть следующие действия с EF:
- Чтение : получить строку и прочитать поле счетчика
- Проверки : выполнить некоторые проверки, сгенерировать и увеличить счетчик
- Запись : обновить строку для будущего использования
Естественно, у нас не должно быть идентификатора дубликата!
Я начал с установки операции (чтение и запись) в транзакции _context.Database.BeginTransaction
- , но не уверены, каков соответствующий уровень изоляции?
- Я прочитал, что Repeatable Read гарантирует, что данные чтения не могут быть обновлены с помощью сопутствующей транзакции, но как насчет сценария, когда: Tran1 Read 3, Tran2 Read 3, Tran1 Update до 4, Tran2 Update до 4 !!! Может ли обновление Tran1 быть выполнено, если да, как Tran2 мог прочитать новое значение после завершения Tran1?
- Я также обнаружил, что: SERIALIZABLE делает обратное и блокирует все. В то время как READ COMMITTED снимает блокировки при чтении строки или по завершении инструкции в зависимости от блокировки, SERIALIZABLE снимает блокировки после фиксации транзакции. Это означает, что другая транзакция, которая хочет обновить данные, которые транзакция прочитала хотя бы один раз, или другая транзакция хочет прочитать данные, которые обновила транзакция, будет заблокирована, пока транзакция не будет зафиксирована.
- или я должен использовать механизм блокировки, чтобы запретить чтение данных для одновременного использования trans для создания неправильного идентификатора?