Я понимаю, что уровень изоляции Serializable является наиболее ограничительным из всех уровней изоляции. Мне любопытно, какие приложения требуют такого уровня изоляции или когда я должен рассмотреть возможность его использования?
Задайте себе следующий вопрос: Будет ли плохо, если кто-то введет новую строку в ваши данные во время выполнения транзакции? Будет ли это неприемлемым образом влиять на ваши результаты? Если да, то используйте уровень SERIALIZABLE.
Из MSDN относительно SET TRANSACTION ISOLATION LEVEL:
SERIALIZABLE
Накладывает блокировку диапазона на набор данных, не позволяя другим пользователям обновлять или вставлять строки в набор данных пока транзакция не будет завершена. Это самый ограничительный из четырех уровней изоляции. Поскольку параллельность ниже, используйте этот параметр только в случае необходимости. Эта опция имеет тот же эффект, что и установка HOLDLOCK на всех таблиц во всех операторах SELECT в транзакции.
Таким образом, ваша транзакция сохраняет все блокировки на протяжении всего времени своего существования - даже те, которые обычно отбрасываются после использования. Это создает впечатление, что все транзакции выполняются по одной, отсюда и название SERIALIZABLE. Примечание из Википедии относительно уровней изоляции:
SERIALIZABLE
Этот уровень изоляции указывает, что все транзакции происходят в полностью изолированно; т.е., как если бы все транзакции в системе выполняются последовательно, одна за друг за другом. СУБД может выполнять две или более транзакций в одно и то же время только в том случае, если иллюзия последовательного выполнения может быть сохранена.
Попробовать учет. Транзакции в учетных записях по своей сути сериализуемы, если вы хотите иметь правильные значения учетной записи И придерживаться таких вещей, как кредитные лимиты.