Я являюсь частью команды, создающей веб-сайт на базе ADO.NET. Иногда у нас есть несколько разработчиков и инструмент автоматического тестирования, которые работают одновременно с копией базы данных для разработки.
Мы используем уровень изоляции моментальных снимков, который, насколько мне известно, использует оптимистичный параллелизм: вместо блокировки он надеется на лучшее и выдает исключение, если вы пытаетесь зафиксировать транзакцию, если затронутые строки были изменены другая сторона во время сделки.
Чтобы использовать уровень изоляции снимков, мы используем:
ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
и в C #:
Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
Обратите внимание, что снимок IsolationLevel отличается от снимка ReadCommitted, который мы также пробовали, но в настоящее время не используем.
Когда один из разработчиков входит в режим отладки и приостанавливает приложение .NET, он будет удерживать соединение с активной транзакцией во время отладки. Теперь, я ожидаю, что это не будет проблемой - в конце концов, все транзакции используют уровень изоляции моментального снимка, поэтому, пока одна транзакция приостановлена, другие транзакции должны быть в состоянии нормально проходить, так как приостановленная транзакция не удерживает никаких блокировок. Конечно, когда приостановленная транзакция завершается, она может обнаружить конфликт; но это приемлемо, если другие разработчики и автоматизированные тесты могут работать беспрепятственно.
Однако на практике, когда один человек останавливает транзакцию во время отладки, все другие пользователи БД, пытающиеся получить доступ к тем же строкам, блокируются, несмотря на использование уровня изоляции моментального снимка.
Кто-нибудь знает, почему это происходит и / или как я могу достичь истинно оптимистичного (неблокирующего) параллелизма?
Резолюция (неудачная для меня) : Ремус Русану отметил, что писатели всегда блокируют других писателей; это подтверждается MSDN - это не совсем так и звучит, но только упоминает об избежании блокировок чтения-записи. Короче говоря, нужное мне поведение не реализовано в SQL Server.