Тайм-аут SQL Server Compact в ожидании блокировки - PullRequest
2 голосов
/ 14 сентября 2009

У меня есть приложение, в котором я использую Sql Compact 3.5 с VS2008. Я запускаю несколько потоков в моем приложении, которое связывается с компактной базой данных и обращается к строке. Он выбирает и удаляет эти строки способом, т.е. выбирает и передает приложению 5 строк и удаляет эти строки из таблицы. Он прекрасно работает с одним потоком, но если я использую несколько потоков, т.е. если запущено 3 или более потоков, я очень часто получаю ошибку TimeOut !!! Я увеличил свойство Time out в строке подключения, но оно не дало ожидаемого результата. Журнал ошибок выглядит следующим образом:

Тайм-аут SQL Server Compact в ожидании блокировки. Время блокировки по умолчанию составляет 2000 мс для устройств и 5000 мс для настольных компьютеров. Время ожидания блокировки по умолчанию можно увеличить в строке подключения с помощью свойства ssce: default timeout. [Идентификатор сеанса = 5, Идентификатор потока = 4204, Идентификатор процесса = 4808, Имя таблицы = XXX, Тип конфликта = x блокировка (блоки s), Ресурс = TAB]

Запрос, который я использую для получения, выглядит следующим образом:

» выберите Top (5) * из таблицы TableName по идентификатору; удалить из TableName, где находится id (выберите top (5) id из порядка TableName по id); «

Есть ли способ, которым мы можем избежать этого исключения Time Out ???????

Приведенный выше запрос выполняется как транзакция в VS2008, одна из которых использует SQLCECommand, а другая - SqlCEDataAdapter.

Любая идея !!!!!! Ответ

Ответы [ 5 ]

2 голосов
/ 01 марта 2011

У меня была точно такая же проблема. Я знаю, что это старый вопрос, но для всех, кто гуглил ответ, я исправил его, вызвав Reader.Close () в моем dataReader, когда закончил с ним.

Приложение было однопоточным, но я получал его все время, если слишком быстро делал слишком много запросов.

Надеюсь, это поможет!

1 голос
/ 14 сентября 2009

Есть некоторые настройки строки подключения, которые вы можете попробовать, такие как «тайм-аут блокировки по умолчанию» и так далее.

См. Свойство SqlCeConnection.ConnectionString в http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.connectionstring(VS.80).aspx.

(у меня не было ничего, кроме проблем с цепочкой запросов с точкой с запятой.)

0 голосов
/ 29 августа 2018

Хотя возможна многопоточность с SQLCE, база данных очень ограничена одновременными транзакциями.

Инкапсуляция каждого связанного с SQLCE класса, который реализует IDisposable в использовании операторов, определенно является хорошей идеей, но ошибка блокировки все равно может возникнуть в зависимости от нагрузки.

Кажется, что ни один из параметров времени ожидания строки соединения не решает эту проблему. В качестве обходного пути я просто повторяю операцию в случае ошибки блокировки.

Обратите внимание, что большой сервер SQL не страдает от этого. Параллельная обработка работает без проблем.

0 голосов
/ 24 августа 2012

У меня была такая же проблема только сейчас ...

Проблема заключалась в том, что я создал таблицу ALTER в транзакции, а затем попытался прочитать из этой таблицы позже в той же транзакции. упс. Убрал таблицу ALTER из транзакции, и все снова чудесно.

0 голосов
/ 14 сентября 2009

Я использую свойство Time Lock по умолчанию, но, похоже, не реагирует или что. Он по-прежнему выдает мне ту же ошибку, которую я сохранил в качестве значения 10000. Запрос ожидает до этого времени и находит, пока таблица занята, и, следовательно, выдает исключение. Есть ли способ, чтобы мы блокировали только строку вместо таблицы ??????

...