Проблема при доступе к другой странице, пока первая страница обрабатывает файл - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть веб-приложение, которое обрабатывает файлы и записывает данные в базу данных. Этот процесс может занять до 2 минут. Допустим, это сделано на ProcessFile.aspx. Я хотел обеспечить целостность данных, поэтому обернул всю обработку базы данных в TransactionScope.

Проблема возникает, когда я обрабатываю файл и затем пытаюсь получить доступ к другой странице, которая также обращается к базе данных (просто читает некоторые данные с помощью оператора select). Я почти уверен, что это не связано с какой-либо блокировкой базы данных, так как когда я иду напрямую через SQL Server Management Studio, у меня нет проблем с выбором таблицы.

Я использую LinqToSQL. У меня есть ScriptManager на главной странице. Все страницы наследуются от этой главной страницы. ProcessFile.aspx имеет панель обновления, а на другой странице - нет.

Что мне здесь не хватает? Если потребуется дополнительная информация, прокомментируйте, и я обновлю вопрос.

РЕДАКТИРОВАТЬ 1: Я получаю это сообщение об исключении

Type : System.Data.SqlClient.SqlException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Source : .Net SqlClient Data Provider

Я открываю вторую страницу в отдельном окне браузера. Он просто продолжает загружаться, пока первая страница не закончит обработку файла, а затем загружается нормально.

Я не звоню с одной страницы на другую. Просто открыв другую страницу через другое окно браузера через адресную строку.

РЕДАКТИРОВАТЬ 2: Впервые я столкнулся с тем, что более чем один ответ решил мою проблему. Ответы Ремуса и Рика в совокупности решили это для меня. Я не знал, кого выбрать в качестве правильного ответа, поэтому подбросил монетку, и Рик выиграл. Извини, Ремус! Я не хотел давать это никому. Тем не менее, мне нужно было реализовать ОБА ответы, чтобы он работал.

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

Это наиболее вероятная блокировка базы данных.

По умолчанию TransactionScope использует сериализуемый уровень изоляции транзакции, что означает, что первая страница будет устанавливать блокировки диапазона для всего, что она читает. Вторая страница попытается выполнить операции с этими заблокированными диапазонами и будет конфликтовать. Ваш выбор SSMS из таблицы мало что доказывает, мы уже знаем, что общие блокировки не конфликтуют.

Откройте первую страницу. Затем откройте вторую страницу и, пока вы ждете, проверьте список блокировок в мониторе активности . Вы найдете, что запросы со второй страницы заблокированы за блокировками, удерживаемыми первой страницей. Конкурирующий ресурс должен указывать, на какой именно операции происходит блокировка.

Самое простое решение - использовать уровень изоляции ReadCommited в TransactionScope и включить чтение зафиксированного снимка в базе данных.

1 голос
/ 18 декабря 2009

Используете ли вы состояние сеанса? Если это так, по умолчанию сеансы используют эксклюзивную блокировку, поэтому вы можете одновременно выполнять только один запрос.

Вы можете обойти это, либо отключив состояние сеанса для долго работающей страницы, либо пометив страницу как требующую только сеансы в режиме только для чтения.

0 голосов
/ 18 декабря 2009

Какая у вас проблема - тайм-аут? исключение?
Что вы имеете в виду доступ к другой странице?
- В том же окне браузера?
- Еще одно отдельное окно?
- Вы звоните с одной страницы на другую?

...