Приложение 1 -
- Открывает SqlConnection и SqlTransaction для базы данных SQLServer 2005
- Вставляет запись в таблицу1
- Не совершает и не откатывает SqlTransaction - намеренно поддерживает это, чтобы продемонстрировать / описать проблему
Приложение 2 -
- Открывает SqlConnection и SqlTransaction для базы данных SqlServer 2005
- Пытается выполнить этот запрос - «ВЫБЕРИТЕ СЧЕТЧИК (Id) ИЗ Table1»
Table1 - Id - это поле Identity. Имя - это поле varchar. Других полей в таблице нет
Приложение 2 не может выполнить запрос «SELECT ...». Кажется, что Table1 заблокирован или заблокирован вставкой, сделанной в Приложении 1.
Хотя вышеупомянутый сценарий вымышлен - он демонстрирует проблему, с которой мы сталкиваемся адекватно. Мы хотим иметь возможность открывать длительную SqlTransaction (возможно, часы) и делать много вставок / обновлений через эту SqlTransaction.
Мы разрабатываем приложение для преобразования данных, которое должно выполнить большую обработку большого количества данных, прежде чем их можно будет вставить / обновить в базу данных. Преобразование данных должно происходить, пока у нас основное приложение на основе WebForms работает на той же базе данных SQLServer 2005, в которой мы хотим выполнить длительную транзакцию.
Все таблицы в нашем приложении сегментированы полем ClientID из таблицы ClientMaster. Например, если у нас есть таблица CollegeMaster, то она будет иметь поле ClientID как часть первичного ключа и поле ID для своей собственной идентификации. Преобразование данных начинается с создания нового ClientID, и это новое поле ClientID используется во всех других таблицах.
В идеале на все запросы, подобные тому, который упомянут в Приложении 2, не должна влиять длительная транзакция. Эти запросы должны только читать / использовать данные, которые уже зафиксированы и продолжают работать, а не блокироваться из-за длительной транзакции. Что может сделать Приложение 1 для обеспечения этого?