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