Чтение Uncommitted определенно является слабым местом на большинстве форумов. Тем не менее, есть причины использовать его, который выходит за рамки вопроса «скорость против точности», на который часто указывают.
Допустим, у вас есть:
- Транзакция T1: запись B, чтение A, (еще немного работы), фиксация.
- Транзакция T2: запись A, чтение B, (еще немного работы), фиксация.
Если чтение завершено, транзакции, указанные выше, не будут освобождены, пока они не будут приняты. Затем вы можете столкнуться с ситуацией, когда T1 ожидает, когда T2 освободит A, а T2 ожидает, когда T1 освободит B. Здесь две транзакции сталкиваются в блокировке.
Вы можете переписать эти процедуры, чтобы избежать этого сценария (пример: получать ресурсы всегда в алфавитном порядке!). Тем не менее, из-за слишком большого количества одновременно работающих пользователей и десятков тысяч строк кода эта проблема может оказаться как очень вероятной, так и очень сложной для диагностики и решения.
Альтернативой является использование Read Uncommitted. Затем вы разрабатываете свои транзакции, предполагая, что может быть грязное чтение. Лично я считаю, что эта проблема гораздо более локализована и поддается лечению, чем взаимосвязанные железнодорожные аварии.
Проблемы из-за грязного чтения могут быть устранены
(1) Откатов: нет. Это должна быть последняя линия защиты только в случае аппаратного сбоя, сетевого сбоя или сбоя программы.
(2) Используйте блокировки приложений для создания механизма блокировки, который работает
на более высоком уровне абстракции, где каждый замок ближе к
реальный ресурс или действие.