2009-06-28 4 views
1

Я столкнулся с проблемой, возникшей в Sql Server. У меня есть карманное приложение для ПК, которое подключается к веб-службе, которая, в свою очередь, подключается к базе данных и вставляет много данных. Веб-служба открывает транзакцию для каждого карманного ПК, который подключается к ней. Каждый день в 12 P.M., 15-20 человек с разными карманными ПК одновременно подключаются к веб-службе и успешно завершают передачу. Но после этого остается одна открытая транзакция (видимая в Activity Monitor), связанная с 4000 эксклюзивными замками. Через несколько часов они исчезают (возможно, что-то не хватает), и некоторые из перенесенных данных удаляются. Есть ли способ предотвратить эти блокировки? Или распознавать их программно и ждать разблокировки?Выполнение транзакции выполняется успешно, но не выполняется

Большое спасибо.

ответ

0

Выполнение большого количества тестов, я обнаружил, что тупик происходит. Но я не мог найти причину, поскольку я просто вставляю столько записей в некоторые независимые таблицы. Эти ссылки немного помогло, но не повезло:

http://support.microsoft.com/kb/323630

http://support.microsoft.com/kb/162361

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

В качестве урока теперь я знаю, что если у вас есть несколько (более чем одной) больших транзакций, выполняемых в одной и той же базе данных одновременно, у вас наверняка возникнут проблемы с SQL Server, я не знаю о Oracle ,

1

Вы можете использовать SQL Server Profiler для отслеживания заявлений, включая начало и конец транзакций. Есть также некоторые инструменты от Microsoft Support, которые великолепны, поскольку они запускают профайлер и блокируют скрипты. Я смотрю, могу ли я найти, что они будут обновляться, если я это сделаю.

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

Редактировать

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

+0

Спасибо. Но Profiler не показывает никакой активности, когда ее трассировка начинается после начала транзакции. – reticent

+0

Точно. Сегодня утром я начал трассировку, и я просматриваю ее для чего-то странного или что-то вроде замков. Вы знаете все, что я должен проверить? – reticent

0

Я подозреваю, что вы делаете что-то не так в коде, у вас есть тайм-ауты команды, установленные на достаточно большое значение для выполнения их работы, или, возможно, ошибка пропускает COMMIT?

Вы можете проверить, какие транзакции открыты, запустив:.

DBCC OPENTRAN 
+0

Я не изменял тайм-ауты команд, и я уверен, что фиксация выполнена (потому что у меня есть 3 транзакции, получаемые сразу, одна в MySql, одна в SqlServer и другая в SqlCE, две другие транзакции совершены, и я могу см. данные). DBCC OPENTRAN показывает открытую транзакцию после фиксации. Я просто не знаю, что теперь делать, чтобы добиться этого. – reticent

+0

Можете ли вы сократить свой код, достаточно маленький, чтобы его можно было разместить здесь? –

+0

// Все методы вызывается webservice, который вызывается из проекта устройства внутри транзакции SqlCE public DataService() { mySqlService = new mySqlService(); connection = new SqlConnection (connectionString); подключение.Open(); transaction = connection.BeginTransaction(); } ... // Методы передачи данных - они используют сделки общественные недействительная Commit() { transaction.Commit(); mySqlService.Commit(); подключение.Close(); } public void Откат() { сделка.Rollback(); mySqlService.Rollback(); } – reticent

2

Вы можете запустить sp_lock и проверить, есть ли какие-либо исключительные блокировки, на столах вы заинтересованы в Это будет сказать вам SPID оскорбительного соединения, и вы можете использовать sp_who или sp_who2, чтобы найти дополнительную информацию об этом SPID.

В качестве альтернативы монитор активности в Studio Management предоставит вам графические версии этой информации, а также позволит вам убить любые нарушающие процессы (команда kill позволит вам сделать то же самое в редакторе запросов).

+0

Спасибо. Мне пришлось ждать, пока это не повторится - сейчас. Как показывает активный монитор, есть открытая транзакция, связанная с процессом. И используя sp_lock, я вижу, что для этого SPID существует около 7000 блокировок. Это ненормально? Если да, то как я могу это предотвратить? Или я могу совершить эту транзакцию? Потому что убийство это не вариант моей проблемы. Еще раз спасибо. – reticent

+0

Это довольно большое количество замков! Те, которые вы хотите посмотреть, - это эксклюзивные блокировки, отмеченные как X, потому что они блокируют доступ к основным ресурсам. (IX, блокировки намерений, запретить другим получать блокировки на родительских объектах; если этот процесс имеет блокировку X в строке, страница и таблица, содержащие эту строку, будут заблокированы на IX). Что касается жадного процесса, посмотрите на sp_who2, чтобы узнать, откуда он подключается, и что такое приложение. Это должно помочь отлаживать. Затем вы можете использовать другие методы, такие как SQL Profiler, для точной настройки отладки. –

+0

72 из них - IX, а все остальные - X. Как показывает sp_who2, это происходит от моего пользователя веб-сервиса, и он говорит, что статус «спящий». Я отлаживал свой код в прошлые разы, и я уверен, что исключений нет. Есть ли какая-либо информация, которую я могу/должен проверить программно после выполнения каждой вставки? Могу ли я сконфигурировать транзакции каким-либо образом, чтобы избежать этих блокировок? – reticent

0

Тайм-аут на выбранном вами флажке указывает, что транзакция по-прежнему открыта с блокировкой по крайней мере в части таблицы.

Как вы совершаете транзакции через веб-службы? Как/где в вашем коде вы совершаете транзакцию?

+0

Я использую System.Data.SqlClient. У меня есть WebMethod, вызываемый карманными ПК, который запускает транзакцию, вставляет данные и фиксирует. Весь метод находится в блоке try/catch, который откатывает транзакцию в случае любого исключения. Отвечал ли я на ваш вопрос? – reticent

+0

Извините! Я был неправ. Я использую MyGeneration.doodads (я использую провайдер .Net для моей базы данных SqlCe). doodads имеет TransactionMgr, который обрабатывает транзакции. Я изменил весь код для использования поставщика .Net Sql сегодня, чтобы узнать, не изменилось ли что-либо. – reticent

Смежные вопросы