Занят с автоматическими тестами на C#, и нам нужно восстанавливать моментальный снимок БД после каждого теста. Проблема в том, что при выполнении нескольких тестов происходит сбой, потому что «состояние базы данных не может быть изменено, пока другие пользователи используют базу данных».
Мы используем SqlConnection.ClearAllPools();
перед восстановлением, но после четвертого теста он снова не восстанавливается для запуска, и кажется, что пулы перестают очищаться. (Почему четыре? См. редактирование 2)
Как я могу сделать это более надежным?
ИЗМЕНИТЬ
Может быть, я должен дать больше информации о системе. Это интеграционные тесты unit для сервиса. Тесты ссылаются на сервисную dll (без ссылки на сервис, мы напрямую обращаемся к методам сервиса). Итак, в тестах нет никакого SQL, кроме восстановления снимка БД после каждого тестового блока.
Это сервис, поэтому мы не совсем управляем соединениями. У нас есть центральная точка, где мы создаем объекты базы данных, из которых мы получаем наши DbCommands для выполнения хранимых процедур.
Используя sp_who2
в студии SQL, я наблюдаю следующее: существует одна сессия с БД для первых четырех тестовых блоков (где каждый блок разделен ClearAllPools()
и восстановлением снимка), но по состоянию на пятый тестовый блок есть три сессии против этого. (Почему? Это может быть ключом к проблеме.) (Восстановление моментального снимка открывает дополнительное соединение с главной БД.) Все открытые соединения находятся в состоянии ожидания, ожидая команды, даже то, которое блокирует соединение для восстановления моментального снимка.
ИЗМЕНИТЬ 2
Почему пять? Я думал, что тестовые случаи будут выполняться случайным образом, но я ошибался. Я нашел виновного. Открывается более одного соединения, система использует только последнее, а остальные остаются зависшими и не будут очищены, пока вы не выйдете.