IsolationLevel - свойство соединения. Я не помню, какое значение в ADO по дефолту, поэтому всегда выставляю
- Код: Выделить всё
Conn.IsolationLevel = adReadCommitted
На стороне сервера это выставляется вот так:
- Код: Выделить всё
SET TRANSACTION ISOLATION LEVEL Read Committed
Подстава тут кроется в том, что высокие уровни изоляции могут класть блокировки на читаемые данные. Поэтому задирать это параметр нежелательно.
Комбинация селектов и апдейтов в одной транзакции вполне допустима, если только твоя транзакция не перелопачивает половину базы в эксклюзивном режиме. Но это надо уже на архитектуру смотреть.
Насчет индексирования - вовсе не обязательно ограничиваться при выборе кандидатов в индексы уникальными полями. В идеале, проиндексировано должно быть все, что вообще может упоминаться в разделе WHERE, и желательно - все, что в разделе SELECT. Вообще, вот тебе ссылка на эту тему, рекомендую -
http://www.sql-server-performance.com , раздел "Find SQL Server Performance Tips by Category". Там много инфы, но поверь мне, она полезна. Я этот сайт в свое время проштудировал практ. весь.
Насчет CommandTimeout - да, у соединения дефолт 30 секунд. А вот насчет комманда непонятно. Более того, комманд не наследует это свойство у соединения. Я так понял, что рекордсет наследует.
Да, вот еще что: у тебя там иерархический провайдер, я смотрю... Не исключено, что большую часть проблем создает именно он - просто в силу особенностей своей работы. Признаться, если одномоментное вытягивание всей кучи малы ведет к таким проблемам, возможно, имеет смысл попробовать тянуть выборки по отдельности, а выстраивать иерархию уже на клиенте, ручками. Но это, конечно, последнее дело, согласен.
Да, вот еще что. Это, конечно, нехорошо - такими вещами пользоваться, но в принципе у MSSQL 2000 есть пара фич, которые позволяют в грубой форме обходить эту проблему. Фича первая, некрасивая:
- Код: Выделить всё
SET DEADLOCK_PRIORITY LOW
Это надо выполнять на коннекте, который в случае дэдлока, что называется, не жалко. Он будет убит гарантированно
вместо того, который тебе нужно спасти любой ценой. Некрасиво, согласен, ну а что делать.
Фича вторая, опасная:
- Код: Выделить всё
select * from payments WITH (NOLOCK)
Эффективный эквивалент режима изоляции транзакций Read Uncommitted - читает грязные данные, минуя любые блокировки, кроме Schema Modification, кажется. Крайне череповато чтением данных, наполовину измененных другим процессом, а потому, в принципе, недостоверных. Однако иногда это имеет смысл, все зависит от контекста задачи.
Я не уверен, что ты воспользуешься хотя бы одним из этих двух методов - уж очень они некошерные, на мой взгляд. Впрочем, решать тебе.