Подтверждение транзакции выполняется успешно, но не завершается - PullRequest
1 голос
/ 28 июня 2009

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

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

Ответы [ 5 ]

2 голосов
/ 28 июня 2009

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

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

1 голос
/ 28 июня 2009

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

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

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

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

0 голосов
/ 03 августа 2009

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

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

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

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

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

0 голосов
/ 28 июня 2009

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

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

0 голосов
/ 28 июня 2009

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

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

DBCC OPENTRAN
...