2010-03-24 2 views
3

У нас есть код Delphi, который использует BDE для доступа к SQL Server 2008 с помощью драйвера ODBC собственного клиента SQL Server (версия 2005 года). Наша проблема заключается в том, что мы сталкиваемся с некоторыми проблемами взаимоблокировки в цикле, которые делают вставки для нескольких таблиц.BDE, Delphi, ODBC, SQL Native Client & Dead lock

Весь цикл выполняется в [TDatabase] .StartTransaction. Посмотрев на профилировщик SQL Server, мы ясно видим, что в один момент во время цикла изменяется идентификатор SPID (Session ID?), А затем мы, естественно, оказываемся в тупике. (Оба ИСП делать вставки в ту же таблицу)

Похоже, что BDE в каком-то момент делает второе подключение к БД ...

(Хотя я хотел бы, чтобы пропустить BDE, это в настоящее время не представляется возможным .)

Кто-нибудь имеет опыт поделиться?

+0

Почему вы не использовали ADO? –

+0

Поскольку кодовая база составляет около 13 лет и сильно зависит от BDE. Кроме того, нам необходимо поддерживать Interbase и MSSQL. – EspenS

+0

Я немного смущен, когда вы произносите «изменение спида». это, вероятно, причина тупика .. вы не можете начать транзакцию в одном spid и попытаться сделать вставки в другом или завершить транзакцию в другом. Знаете ли вы, как вы заканчиваете двумя шпилями? вы не многопоточность, так вы создаете второе соединение с базой данных? –

ответ

1

Если ваше приложение многопоточное: BDE не является потоковым. Вы должны использовать отдельный сеанс BDE (явно созданный экземпляр TSession) для каждого потока; глобальный Session, созданный автоматически для основного потока, недостаточен. Кроме того, все компоненты доступа к базе данных (TDatabase, TQuery и т. Д.) Могут использоваться только в контексте потока, где был создан их соответствующий экземпляр TSession.

+0

Приложение не многопоточно. – EspenS

1

Проверьте установку ODBC, если драйвер SQL Server настроен на объединение пулов соединений. Появитесь, что установка собственного клиента активирует его по умолчанию ... (По крайней мере, у моей установки был активен пул соединений, и я его не активировал).

0

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

Каждый раз, когда курсор не закрывается, комбо BDE/ODBC устанавливает новое соединение для последовательных запросов. «Сдвиг изменения», вероятно, является результатом неблокированного курсора.

Для решения этой проблемы вам необходимо найти компонент BDE, который вызвал этот открывшийся курсор. Затем вы вызываете метод, который в конечном итоге закроет курсор (TTable.Close, TTable.Last ...).

После этого «спад изменения» должен быть удален и, следовательно, тупик.

Некоторые советы, чтобы найти этот компонент:

  • Во время блокировки, выполните следующее утверждение (например, с помощью Management Studio): EXEC sp_who2.
  • Заглянуть в колонку BlkBy. В заблокированном соединении есть число.
  • Этот номер является spid (идентификатор сервера) блокирующего соединения.
  • Затем вы выполняете DBCC INPUTBUFFER(spid).
  • В столбце EventInfo вы найдете инструкцию sql, выданную вашей программой.
  • С помощью этой информации вы сможете найти BDE-компонент, который вызывает проблемы.