Полагаю, этот вопрос лучше подходит для serverfault.com, где сказано, что я понимаю эту тему:
Во-первых, так как, когда уровень изоляции по умолчанию стал Serializable, я подумал, что это Read Committed!
Во-вторых, снимок может быть не очень хорошей идеей, поскольку он эффективно использует базу данных tempdb (которая по большей части находится в памяти) для хранения одновременных версий данных, поэтому, если вам повезет, вам не хватит оперативной памяти на 1- 2-3.
В-третьих, уровень сериализации не является делом «все или ничего», вместо этого вы должны смотреть на каждый запрос и устанавливать его для каждого запроса, используя подсказки запроса или что-то еще. Я бы сказал, что для вашего магического оператора select, который используется везде, где вы, возможно, даже захотите использовать подсказку (nolock) (при условии, что базовая таблица предназначена для чтения только на 99,99%; кстати, если вы заметили, что делаете слишком много операций только для чтения, это указывает на то, что вы должны искать в кеширование, будь то собственный кеш ASP.NET или Memcached или что-то еще), в то время как остальные могут использовать зафиксированное чтение. Только в редких случаях (например, автоматически поддерживаемая таблица поиска) вы хотите что-то выше этого.
Далее, не злоупотребляйте пессимистической блокировкой вообще. Более разумный выбор - использовать оптимистическую блокировку, например вставьте, надеясь, что нет никакого заблуждения и разберитесь с невыполненным ограничением впоследствии и тому подобными вещами. Для обновлений вы можете добавить столбец отметки времени и включить его в предложение where. Если кто-то похитил обновление до вас, количество строк будет равно 0. И т.д.
Надеюсь, это имеет смысл.