![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа БД с MS SQL, что лучше? [D6, D7, MSSQL]
_sulent © (2005-08-23 07:36:00)Приветствую!
У меня вопрос такого характера. Работаю с MSSQL через ADO и получается очень неприятная история. Сколько уже бьюсь никак не получается от нее отвязаться.
Допустим программа работает по сети, и если один клиент выполняет запрос на добавление, а второй делает select, то как бы все нормально происходит с добавлением, транзакция вроде как завершается, но... база блокируется. Т.к. говорит что мол таблицы заблокированы, типа до конца не завершился insert. Хотя commit прошел, может есть какая-то тонкость в этом деле?
Что только не пробовал, и через параметры, и даже PAGLOCK, но толку никакого.
Заранее благодарен
АлексейК (2005-08-25 12:57:00) [1]
try
adoconnection1.begintrans;
query1.execsql;
query2.execsql;
...
queryn.open;//select
adoconnection1.commit;
except
...
adoconnection1.rollbakack;
end;
Интересно, а что должен вернуть запросqueryn?
_sulent (2005-08-24 12:09:00) [2]я ошибся, этого не присутсвует :)
Ольга (2005-08-23 14:48:00) [3]
> [15] queryn.open;//select
Это зачем присутствует в транзакции?
_sulent (2005-08-23 11:49:00) [4]Пробую и пытаюсь, только лента уже развилась не на первоначальной проблеме, а привязалась к QA. Там это безпроблем делается. Учитываю все высказывания и предложения. Но последние посты, они мне как-то не особенно помогают.
Когда я выполняю эту беду на своем компе, без клиентов, нормально.
Теперь из учета всего сказанного я понял приблезительно что нужно делать и, самое главное, как...
Спасибо что не отказали в трудный момент!
sniknik (2005-08-23 11:38:00) [5]> Делаю приблизительно такую штуку:
а ответы читаеш? и пытаешся проверить... или ты их коллекционируеш?
если читаеш и пробуеш то перечитай и перепробуй первый ([1]) пост.
sniknik (2005-08-23 11:35:00) [6]> Вы в состоянии представить себе "не выполненные команды" и их "завершение" с помощью GO?
вполне. ;о))
но мое представление это не то что есть в действительности (хотя и это возможно). ;о)
к примеру блок команд (до GO) выполняется в асинхронном режиме, GO это команда ожидания завершения работы этого блока. (естественно это не с помощью а с использованием... но можно списать на корявость изложения)
_sulent (2005-08-23 11:34:00) [7]AdoConnection я естесственно использую иначе я просто не прставляю нормальной работы транзакций. IsolationLavel у меня стоит ilReadCommitted. Делаю приблизительно такую штуку:
// собираю запросы
try
adoconnection1.begintrans;
query1.execsql;
query2.execsql;
...
queryn.open;//select
adoconnection1.commit;
except
...
adoconnection1.rollbakack;
end;
Fay (2005-08-23 11:25:00) [8]2 sniknik © (23.08.05 11:10) [13]
Допустим, я тоже типа понял, что имелось ввиду...
Но скажите, Вы в состоянии представить себе "не выполненные команды" и их "завершение" с помощью GO?
sniknik (2005-08-23 11:10:00) [9]Fay © (23.08.05 11:02) [12]
он имеет ввиду, что GO это команда самого QA а не MSSQL
правда я не понял к чему он это сказал, вроде никакого указания на то что автором вопроса выполняются запросы в QA не было... и потом, там тоже парные селект/инсерт вполне работают и в одном блоке.
Fay (2005-08-23 11:02:00) [10]2 Layner © (23.08.05 9:58) [8]
>> Завершает все не выполненные команды
Чушь.
>> запрос не выполнится, выскочит ошибка в синтаксисе
Удивительно!
sniknik (2005-08-23 10:16:00) [11]> После insert'a делаешь сразу select, то выдается что запись не найдена, а коммит уже прошел. И причем такое
> случается не всегда.
впечатление от "выдавленной" капли информации такое - в программе не используется ADOConnection..., а созданные автоматически над каждым компонентом конекты используют буферизацию, у каждого своя... следующий селект просто не видит данные еще не сохраненные из соседнего буфера... то что иногда всетаки срабатывает, говорит либо о том что ком быстрый, либо селекты делаются неравномерно (те что с задержкой работают).
еще возможно (как вариант и не единственный) используются асинхронные запросы... они естественным образом в разных потоках выполняются и поэтому возможно выполнение следующего до завершения предыдущего. (если по коду в дельфи смотреть)
Anatoly Podgoretsky © (23.08.05 08:59) [3]
а не сделать ли специальный значек "партизан"... ;о)), чтобы быть готовым к типу "общения", либо игнорировать вопросы от них.
alex_*** (2005-08-23 10:11:00) [12]а если посмотреть счетчик транзакций?
MOA (2005-08-23 10:10:00) [13]1. Не используются ли хинты в селектах/инсертах?
2. Не поставлен ли "суровый" уровень изоляции транзакций - SERIALIZABLE, например?
Удачи!
Layner (2005-08-23 09:58:00) [14]GO
Завершает все не выполненные команды, какая чушь? Если в QA написать, ошибки не будет, если написать в запросе на INSERT в ADOQuery, и в конце GO написать, запрос не выполнится, выскочит ошибка в синтаксисе.
Fay (2005-08-23 09:48:00) [15]2 Layner © (23.08.05 9:36) [6]
Чушь
Layner (2005-08-23 09:36:00) [16]_sulent (23.08.05 09:18)
GO- Добавлять, точно увидишь SELECT. Правда в ADO ошибка выскочит на синтаксис.
_sulent (2005-08-23 09:18:00) [17]и еще вдобавок. После insert'a делаешь сразу select, то выдается что запись не найдена, а коммит уже прошел. И причем такое случается не всегда. Иногда проходит нормально. Такое впечателение складывается, что запись еще не успела создаться, а он пытается делать выборку. Такая же беда случается и с созданием временных таблиц.
_sulent (2005-08-23 09:15:00) [18]Ответ есть ответ, но он ни капельки не помогает в решении той или иной проблемы. Я спрашиваю про наиболее вероятные, из учета которых можно будет судить о правильности построения кода.
Просто я взялся переписывать все полностью, и хочу учесть все возможные варианты, чтобы потом не было мучительно больно!
Anatoly Podgoretsky (2005-08-23 08:59:00) [19]_sulent (23.08.05 08:52) [2]
Количество возможных ошибок превосходит человеские фантазии. Количество партизан среди программистов превосходит средний уровень.
_sulent (2005-08-23 08:52:00) [20]Спасибо, учту в следующий раз!
Да и транзакции выполняются уже с собранными данными, и пролетает она довольно быстро. 1 до 3 сек.
И какого рода может быть ошибка в программе? Какие явные причины могут этому послужить?