Обычная вставка транзакции (т.е. READ COMMITTED) уже выполняет «минимальную» блокировку. Вставка интенсивных приложений не будет блокировать вставку, независимо от того, как вставка смешана с другими операциями. В худшем случае интенсивная система вставки может привести к конфликту защелок страницы в горячей точке, где происходит вставка, но не к блокировке.
Чтобы вызвать взаимные блокировки, как описано Джеффом, в игре должно быть что-то большее, например, любое из следующего:
- Система использует более высокий уровень изоляции (у них она была тогда и вполне заслуживает этого)
- Они читали из таблицы журнала во время транзакции (поэтому больше не «только для добавления»)
- В цепочке взаимоблокировок задействованы блокировки прикладного уровня (т. Е. Операторы .Net
lock
в каркасе log4net), приводящие к необнаружимым тупикам (т. Е. Зависание приложения). Учитывая, что решение этой проблемы заключалось в рассмотрении дампов процессов, я полагаю, что это был их сценарий.
Так что, пока вы вставляете только запись в транзакции уровня изоляции READ COMMITTED, вы в безопасности. Если вы ожидаете, что та же проблема, как я подозреваю, имела место в SO (то есть в случае взаимных блокировок, связанных с блокировками уровня приложения), никакое количество волшебников базы данных не сможет вас спасти, поскольку проблема все еще может проявиться, даже если вы входите в отдельную транзакцию или в отдельное соединение.