BDE, Delphi, ODBC, собственный клиент SQL и мертвая блокировка - PullRequest
3 голосов
/ 24 марта 2010

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

Весь цикл выполняется внутри [TDatabase] .StartTransaction. Глядя на SQL Server Profiler, мы ясно видим, что в какой-то момент цикла SPID (идентификатор сеанса?) Меняется, и затем мы, естественно, заходим в тупик. (Оба SPID делают вставки в одну таблицу)

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

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

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

Ответы [ 3 ]

1 голос
/ 22 июля 2010

В установке ODBC проверьте, настроен ли драйвер SQL Server для создания пула соединений. Кажется, что установка Native Client активирует его по умолчанию ... (По крайней мере, моя установка имела активный пул соединений, и я не активировал его).

1 голос
/ 24 марта 2010

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

0 голосов
/ 27 августа 2014

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

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

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

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

Несколько советов по поиску этого компонента:

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